ปัญหาการแสกนไดเร็คทอรี่ด้วย readdir
จริงๆแล้วปัญหานี้ผมพบด้วยความบังเอิญ แต่กว่าจะรู้ว่าต้นเหตุของปัญหาคืออะไรก็หมดไปหลายชั่วโมง
คำสั่งด้านบนก็เป็นคำสั่งทั่วๆไปที่เรามักใช้ในการอ่านไฟล์และโฟลเดอร์ทั้งหมดในไดเร็คทอรี่ ซึ่งก็ไม่มีอะไรผิดหรอกครับ ทุกอย่างสามารถทำงานได้ตามปกติ
แต่ปัญหามันเกิดตอนที่มีโฟลเดอร์ 0/ อยู่ด้วยสิครับ
while ($text = readdir($f)) {
เมื่อพบโฟลเดอร์ 0/ เราก็จะได้ค่า 0 คืนมาที่ตัวแปร $text ทำให้ลูป while ตรวจสอบว่าเป็น เท็จ (ใน PHP 0 คือ เท็จ ส่วนค่าอื่นๆคือ จริง) และ หยุดอ่านไดเร็คทอรี่ ซึ่งหากมีไดเร็คทอรี่หรือไฟล์อื่นๆอยู่ต่อจากนี้ ก็จะไม่สามารถรายงานไฟล์นั้นๆได้
การแก้ปัญหา
ในทางปฎิบัติ ถ้าเลือกได้ ผมแนะนำว่าไม่ควรใช้ชื่อโฟลเดอร์เป็น 0 ครับ เพราะอาจทำให้โปรแกรมอ่านค่าผิดพลาดได้ หรือ อาจเลือกใช้วิธีอื่นในการอ่านค่าก็ได้ครับ (ถ้าเราเขียนโปรแกรมนี้เอง) เช่น
$f = @opendir($dir);
if ($f) {
while ($text = readdir($f)) {
if ($text != "." && $text != "..") {
// do some thing
}
}
closedir($f);
}
คำสั่งด้านบนก็เป็นคำสั่งทั่วๆไปที่เรามักใช้ในการอ่านไฟล์และโฟลเดอร์ทั้งหมดในไดเร็คทอรี่ ซึ่งก็ไม่มีอะไรผิดหรอกครับ ทุกอย่างสามารถทำงานได้ตามปกติ
แต่ปัญหามันเกิดตอนที่มีโฟลเดอร์ 0/ อยู่ด้วยสิครับ
while ($text = readdir($f)) {
เมื่อพบโฟลเดอร์ 0/ เราก็จะได้ค่า 0 คืนมาที่ตัวแปร $text ทำให้ลูป while ตรวจสอบว่าเป็น เท็จ (ใน PHP 0 คือ เท็จ ส่วนค่าอื่นๆคือ จริง) และ หยุดอ่านไดเร็คทอรี่ ซึ่งหากมีไดเร็คทอรี่หรือไฟล์อื่นๆอยู่ต่อจากนี้ ก็จะไม่สามารถรายงานไฟล์นั้นๆได้
การแก้ปัญหา
ในทางปฎิบัติ ถ้าเลือกได้ ผมแนะนำว่าไม่ควรใช้ชื่อโฟลเดอร์เป็น 0 ครับ เพราะอาจทำให้โปรแกรมอ่านค่าผิดพลาดได้ หรือ อาจเลือกใช้วิธีอื่นในการอ่านค่าก็ได้ครับ (ถ้าเราเขียนโปรแกรมนี้เอง) เช่น
$f = @opendir($dir);
if ($f) {
while (false !== ($text = readdir($f))) {
if ($text != "." && $text != "..") {
// do some thing
}
}
closedir($f);
}