2009-12-09 7 views
11

मैं जानता हूँ कि मैं यह कर सकता ...क्या ग्लोब() में निषेध है?

glob('/dir/somewhere/*.zip'); 

... .zip में समाप्त होने वाले सभी फ़ाइलों को प्राप्त करने के लिए, लेकिन वहाँ सभी फ़ाइलें नहीं ज़िप रहे हैं वापस जाने के लिए एक तरीका है?

या क्या मुझे बस उस एक्सटेंशन के साथ फिर से भरना चाहिए और फ़िल्टर करना चाहिए?

+0

** नकारात्मक वाइल्डकार्ड ** –

उत्तर

8

मुझे नहीं लगता कि ग्लोब एक "नहीं-वाइल्डकार्ड" क्या कर सकते हैं करते हैं ...

मैं कम से कम दो अन्य समाधान देखें:

  • opendir/readdir/closedir
  • के combinaison का उपयोग
  • या कुछ एसपीएल इटरेटर का उपयोग करें; अधिक विशिष्ट होने के लिए, मैं DirectoryIterator के बारे में सोच रहा हूं; और शायद आप इसे FilterIterator के साथ जोड़ सकते हैं? अन्य तरीकों पास्कल उल्लेख किया और अधिक कुशल हो सकता है में से एक का उपयोग कर

    $all = glob('/dir/somewhere/*.*'); 
    $zip = glob('/dir/somewhere/*.zip'); 
    $remaining = array_diff($all, $zip); 
    

    हालांकि,:

18

तुम हमेशा कुछ इस तरह की कोशिश कर सकते।

+0

इस विधि के साथ शुरू नहीं और अधिक सुरुचिपूर्ण है। +1 –

+0

मुझे संदेह है कि प्रदर्शन ओवरहेड बड़ी निर्देशिकाओं/सरणी पर कुछ हद तक पर्याप्त हो सकता है, हालांकि, यह निश्चित रूप से सबसे सुंदर उदाहरण है। +1 – Unsigned

0
$dir = "/path"; 
if (is_dir($dir)) { 
    if ($d = opendir($dir)) { 
      while (($file = readdir($d)) !== false) { 
       if (substr($file, -3, 3) != "zip"){ 
        echo "filename: $file \n"; 
       } 
      } 
     closedir($d); 
    } 
} 

एनबी: "।" और ".." का ख्याल नहीं रखा। ओपी के लिए

15

सब कुछ के लिए glob() का एक त्वरित तरीका होगा और उन फ़ाइलों को फ़िल्टर करने के लिए preg_grep() का उपयोग करें जो आप नहीं चाहते हैं।

preg_grep('#\.zip$#', glob('/dir/somewhere/*'), PREG_GREP_INVERT) 

इसके अलावा Glob Patterns for File Matching in PHP

+0

आह स्नैप, यह एक * सुपर पुराना * प्रश्न है। * \ * एलेक्स पर मुट्ठी हिलाता है \ ** – salathe

+0

इसे करने का बहुत अच्छा तरीका – goat

+0

@ सलाथ तुम मुझ पर अपनी मुट्ठी क्यों हिला रहे हो? – alex

9

देखना यह पैटर्न काम करेगा:

glob('/dir/somewhere/*.{?,??,[!z][!i][!p]*}', GLOB_BRACE); 

जो/dir में सब कुछ पाता है/कहीं/एक बिंदु या तो

  • एक वर्ण के बाद में समाप्त होने वाले (?)
  • या दो वर्ण (??)
  • या कुछ भी लगातार पत्र जेड, मैं, पी ([!z][!i][!p]*)
+0

क्षमा करें @ गॉर्डन, -1। यह सब कुछ \/dir/कहीं// में एक बिंदु में समाप्त होता है जिसके बाद तीन वर्ण होते हैं ('ज़िप 'सहित)। यह ** ** ** लंबा या छोटा फ़ाइल एक्सटेंशन नहीं होगा। – salathe

+0

@ सलाथ हम्म। धन्यवाद। विवरण अद्यतन किया गया। दरअसल, मैं इसे '{! ज़िप}' के साथ काम करने की कोशिश कर रहा था लेकिन स्पष्ट रूप से PHP इसका समर्थन नहीं करता है? उपरोक्त ब्रेसिज़ के साथ मिश्रित किया जा सकता है? – Gordon

+2

* ऊपर दिए गए ब्रेसिज़ के साथ मिश्रित किया जा सकता है? * हाँ, यह हो सकता है। उदाहरण के लिए, '*। {?, ??, [! Z] [! I] [! P] *}' – salathe

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