2011-06-14 10 views
11

मैं एक कोड सेगमेंट को अंतिम रूप दे रहा हूं जो निर्देशिका में फ़ाइलों को सूचीबद्ध करता है। मुझे निर्देशिका में फ़ाइलों को सूचीबद्ध करने में कोई समस्या नहीं है, लेकिन किसी कारण से मैं यह सुनिश्चित करने के लिए isDot() विधि को काम करने के लिए प्राप्त कर सकता हूं कि फ़ाइल "।" या ".."। ऐसा गलती से हुआ परिणामों के नीचे निम्नलिखित:isDot() मुझ पर असफल क्यों होता है? (PHP)

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

इससे पहले कि मैं रिकर्सिव इटरेटर का उपयोग कर रहा निर्देशिका इटरेटर उपयोग कर रहा था पर स्विच और यह ठीक काम किया। क्या नीचे दिए गए कोड में कुछ गड़बड़ है? यह काम करना चाहिए।

$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;    

     }  
} 

उत्तर

28

ऐसा इसलिए, क्योंकि DirectoryIterator::current() (विधि, कि एक foreach -loop के भीतर कॉल है) एक वस्तु है, जो खुद प्रकार DirectoryIterator की है देता है। FileSystemIterator (वह RecursiveDirectoryIterator विस्तारित करता है) SplFileInfo का ऑब्जेक्ट डिफ़ॉल्ट रूप से देता है। , क्या वापसी है, तो आप को प्रभावित कर सकते flags

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

के माध्यम से लेकिन आपके मामले में, आप परीक्षण करने के लिए, अगर एक आइटम एक डॉट फ़ाइल है की जरूरत नहीं है। बस FilesystemIterator::SKIP_DOTS सेट करें और वे बिल्कुल दिखाई नहीं देंगे। ध्यान दें, यह भी default behavior है।

+2

ग्रेट स्पष्टीकरण! मुझे यह समझाने के लिए धन्यवाद। – thomascirca

संबंधित मुद्दे