ปัญหาการแสกนไดเร็คทอรี่ด้วย readdir

จริงๆแล้วปัญหานี้ผมพบด้วยความบังเอิญ แต่กว่าจะรู้ว่าต้นเหตุของปัญหาคืออะไรก็หมดไปหลายชั่วโมง
$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);
}
ผู้เขียน goragod โพสต์เมื่อ 31 ส.ค. 2555 เปิดดู 3,632 ป้ายกำกับ PHP
^