2011-06-14 43 views
11

Tôi đang hoàn tất một đoạn mã liệt kê các tệp trong một thư mục. Tôi không có vấn đề liệt kê các tập tin trong một thư mục nhưng vì một lý do nào đó tôi có thể nhận được phương thức isDot() để làm việc để đảm bảo tệp không phải là "." hoặc là ".." . Sau đây bên dưới kết quả trong lỗi này:Tại sao isDot() thất bại đối với tôi? (PHP)

Fatal error: Call to undefined method SplFileInfo::isDot() in .... 

Trước khi tôi chuyển sang sử dụng đệ quy Iterator Tôi đã sử dụng danh mục Iterator và nó làm việc tốt. Có điều gì sai với mã bên dưới không? Nó sẽ hoạt động.

$files = new RecursiveIteratorIterator(new RecursiveDirectoryIterator($pathToFolder)); 

//if there is a subdirectory it makes sure the proper extension is passed 
foreach($files as $name => $file){  

      if (!$file->isDot()) { //this is where it shuts me down   

      $realfile = str_replace($pathToFolder, "", $file); 
      $url = getDownloadLink($folderID, $realfile); 
     $fileArray[] = $url;    

     }  
} 

Trả lời

28

Đây là, bởi vì DirectoryIterator::current() (phương pháp, đó là cuộc gọi trong vòng một -loop foreach) trả về một đối tượng, mà là chính nó kiểu DirectoryIterator. FileSystemIterator (rằng RecursiveDirectoryIterator mở rộng) trả về một đối tượng là SplFileInfo là mặc định. Bạn có thể gây ảnh hưởng, là những gì trở lại, qua flags

$files = new RecursiveIteratorIterator(
    new RecursiveDirectoryIterator(
    $pathToFolder, 
    FilesystemIterator::KEY_AS_PATHNAME | FilesystemIterator::CURRENT_AS_SELF)); 

Nhưng trong trường hợp của bạn, bạn không cần phải kiểm tra, nếu một mục là một dot-file. Chỉ cần đặt FilesystemIterator::SKIP_DOTS và chúng sẽ không xuất hiện chút nào. Lưu ý rằng đây cũng là default behavior.

+2

Giải thích tuyệt vời! Cảm ơn vì đã giải thích điều đó với tôi. – thomascirca

Các vấn đề liên quan