2010-12-28 10 views
15
foreach(new RecursiveIteratorIterator(new RecursiveDirectoryIterator(".")) as $file) { 
    echo "$file\n"; 
} 

क्या इस कोड के लिए अप्रत्याशित ValueException फेंकने का कोई तरीका नहीं है "डीआईआर खोलने में विफल: अनुमति अस्वीकृत" जब भी निर्देशिका के अंदर एक अपठनीय उपनिर्देशिका है तो मैं सूची बनाने का प्रयास करता हूं?क्या मैं रिकर्सिव डायरेक्टरी इटरेटर को अपठनीय निर्देशिका छोड़ सकता हूं?

अद्यतन

while() को foreach() परिवर्तित और स्पष्ट रूप से Iterator::next()try() catch {} में लिपटे मदद नहीं करता है बुला। यह कोड:

$iter = new RecursiveIteratorIterator(new RecursiveDirectoryIterator(".")); 
while($iter->valid()) { 
    $file = $iter->current(); 
    echo "$file\n"; 
    try { 
     $iter->next(); 
    } catch(UnexpectedValueException $e) { 
    } 
}; 

अपठनीय उपनिर्देशिका होने पर एक अनंत लूप है।

+0

कोशिश पकड़ ब्लॉक में लपेट। और यह लगता है कि s3v3n की टिप्पणी पर विस्तृत करने के लिए foreach कोष्ठक – s3v3n

+0

के अंदर नई ऑब्जेक्ट्स बनाने के लिए एक बुरा विचार है। यह एक बुरा विचार प्रतीत होता है, क्योंकि वास्तव में क्या चल रहा है यह निर्धारित करना बहुत मुश्किल है। अच्छा कोड हमेशा सबसे छोटा या सबसे तेज़ कोड नहीं होता है। – DampeS8N

+0

यह निर्धारित करना मुश्किल नहीं है कि क्या होता है यदि आपको पता है कि रिकर्सिवइटरेटरइटरेटर और रिकर्सिव डायरेक्टरी इटरेटर क्या है और उनका सामान्य उपयोग केस क्या है। यह आसान कोड है। –

उत्तर

19

जाहिर है आप $flags निर्माता के लिए पैरामीटर पारित कर सकते हैं। केवल one flag in the docs है, लेकिन यह वही करता है जो आप चाहते हैं: catches exceptions during getChildren() calls and simply jumps to the next element

new RecursiveIteratorIterator(
    new RecursiveDirectoryIterator("."), 
    RecursiveIteratorIterator::LEAVES_ONLY, 
    RecursiveIteratorIterator::CATCH_GET_CHILD); 

करने के लिए अपने वर्ग निर्माण कोड को बदलें और यह काम करना चाहिए

+0

वही है जो मुझे चाहिए था। आपका बहुत बहुत धन्यवाद! –

+0

मुझे यहां एक समान समस्या है http://stackoverflow.com/questions/14410899/unable-to-skip-unreadable-directories-with-recursivedirectoryiterator क्या आपके पास कोई समस्या है कि मैं आपकी समस्या को हल करने के लिए समाधान कैसे कर सकता हूं? – ak85

+0

विशेष रूप से, ध्वज है: CATCH_GET_CHILD –

0

यह संभव है कि एक निर्देशिका पठनीय नहीं होने पर भी इटरेटर स्थिति मान्य होगी।

आप निर्देशिका प्रविष्टि की स्थिति की जांच कर सकते हैं। लापरवाह अपरीक्षित नमूना कोड:

$iter = new RecursiveIteratorIterator(new RecursiveDirectoryIterator(".")); 
foreach ($iter as $dir) { 
    if($dir->isReadable()){ 
     //do something 
    } 
} 
+0

यह काम नहीं करता है। अपरेटर अगली स्थिति में आगे बढ़ने के रूप में अपवाद फेंक दिया जाता है। –

7

आप कुछ इस तरह कर सकता है:

class ReadableFilter extends RecursiveFilterIterator{ 
    public function accept(){ 
      return $this->current()->isReadable(); 
    } 
} 

$filteredIterator = new RecursiveIteratorIterator(new ReadableFilter(new RecursiveDirectoryIterator("."))); 

foreach ($filteredIterator as $file){ 
    echo "$file\n"; 
} 
+0

यह बहुत दिलचस्प है। –

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

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