2012-05-15 7 views
6

के साथ खाली निर्देशिकाओं को रिकर्सलीली हटाएं मैं एसपीएल इटरेटर्स का उपयोग करके PHP में खाली निर्देशिकाओं के पेड़ को हटाने के तरीके से संघर्ष कर रहा हूं।PHP एसपीएल इटरेटर्स

$it = new RecursiveIteratorIterator(new RecursiveDirectoryIterator(
    '/topdir', RecursiveIteratorIterator::CHILD_FIRST 
)); 

foreach ($it as $file) { 
    if ($file->isDir()) { 
     rmdir((string)$file); 
    } 
} 

लेकिन RecursiveIteratorIterator::CHILD_FIRST नीचे स्तर फ़ाइल से बचाता है:

/topdir

level1 

     level2 

मैं निम्नलिखित की कोशिश की है: निम्नलिखित निर्देशिका संरचना जिसमें सभी निर्देशिका खाली हैं पर विचार करें लूप का हिस्सा होने से और मुझे मानक Directory not empty ई_ चेतावनी मिलती है क्योंकि स्तर 1 खाली नहीं है।

मैं एसपीएल इटरेटर्स का उपयोग करके रिक्त निर्देशिकाओं के पेड़ को दोबारा कैसे हटा सकता हूं? नोट: मुझे पता है कि glob, scandir आदि के साथ ऐसा कैसे करें, कृपया समाधान के रूप में इन/समान कार्यों की पेशकश न करें।

मुझे लगता है कि मैं यहाँ बहुत प्राथमिक कुछ कमी किया जाना चाहिए ...

+1

को ::SKIP_DOTS फ्लैग जोड़ने आप सुनिश्चित करें कि इन सभी निर्देशिकाओं को शामिल कर रहे हैं निर्देशिका के अलावा कुछ और नहीं? –

+0

ठीक है हाँ वे संभवतः हैं, मैं इस त्रुटि को खाली डीआईआर के साथ पुन: उत्पन्न करने में सक्षम था। :) –

+0

हां। मैंने विशेष रूप से इस समस्या के लिए एक निर्देशिका जांच के रूप में निर्देशिका संरचना बनाई है। – rdlowrey

उत्तर

9

यह RecursiveIteratorIterator कि वास्तविक बच्चे-निर्देशिका के दौरा करता है। RecursiveDirectoryIterator केवल इसके लिए हैंडल प्रदान करता है।

इसलिए, आप RecursiveDirectoryIterator पर RecursiveIteratorIterator पर CHILD_FIRST ध्वज सेट और नहीं की जरूरत है:

$it = new RecursiveIteratorIterator(new RecursiveDirectoryIterator('/topdir', FilesystemIterator::SKIP_DOTS), RecursiveIteratorIterator::CHILD_FIRST 
); 

foreach ($it as $file) { 
    if ($file->isDir()) { 
     rmdir((string)$file); 
    } 
} 

को रोकने के लिए चेतावनी भी RecursiveDirectoryIterator

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