2012-12-29 13 views
24

मैं जानता हूँ कि glob सभी फ़ाइलों या फ़ोल्डर के अंदर ही सभी निर्देशिकाओं के लिए देख सकते हैं कि:क्या ग्लोब() केवल फाइलों का कोई तरीका है?

echo "All files:\n"; 
$all = glob("/*"); 
var_dump($all); 

echo "Only directories\n"; 
$dirs = glob("/*", GLOB_ONLYDIR); 
var_dump($dirs); 

लेकिन मैं कुशलता से एक पंक्ति में केवल वे फ़ाइलें खोजने के लिए कुछ नहीं मिला था।

$files = array_diff(glob("/*"), glob("/*", GLOB_ONLYDIR)); 

अच्छी तरह से काम करता है, लेकिन निर्देशिका दो बार पढ़ता है (वहाँ some optimizations कि दूसरी ब्राउज़िंग तेज कर रहे हैं, भले ही)।

+1

आप 'ग्लोब ("*। *") कर सकते हैं, यह काम नहीं करता है, हालांकि इसमें फ़ोल्डर में' .' है, या फ़ाइल में कोई एक्सटेंशन नहीं है। –

उत्तर

44

मैं अंत में एक समाधान नहीं मिला:

echo "Only files\n"; 
$files = array_filter(glob("/*"), 'is_file'); 
var_dump($files); 

लेकिन ध्यान रखना, array_filter संख्यात्मक कुंजियों सुरक्षित करेगा: array_values उपयोग करें यदि आप सरणी पुन: अनुक्रमणिका की जरूरत है।

+0

अच्छा! फ़ोरैच लूप का उपयोग सरणी_फिल्टर से संरक्षित संख्यात्मक कुंजी के मुद्दे को हल करेगा। – Imdad

-10
$all = glob("/*.*"); 

यह सब कुछ "।" फ़ाइल नाम के बाद। तो मूल रूप से, सभी फाइलें।

+14

फाइलों को एक्सटेंशन कब करने की आवश्यकता है? और आपको क्या लगता है कि किसी निर्देशिका में उसके नाम पर कोई डॉट नहीं हो सकता है? –

5

आप GLOB_BRACE उपयोग कर सकते हैं जाना जाता है फ़ाइल एक्सटेंशन की सूची के खिलाफ दस्तावेज़ से मेल करने के लिए:

$files = glob("/path/to/directory/*.{jpg,gif,png,html,htm,php,ini}", GLOB_BRACE); 

देखें:

$files = glob("/path/to/directory/*.{*}", GLOB_BRACE); 

: http://www.electrictoolbox.com/php-glob-find-files/

+6

ज्यादातर मामलों में काम करेगा, लेकिन देखभाल करें क्योंकि निर्देशिकाओं को 'toto.jpg' नाम दिया जा सकता है यदि आप चाहें। –

3

वहाँ एक आसान तरीका है, बस एक लाइन है {*} का अर्थ है सभी फ़ाइल समाप्ति, इसलिए प्रत्येक फ़ाइल, लेकिन कोई फ़ोल्डर नहीं!

+2

नहीं, '{}' किसी भी चरित्र को भेदभाव के बिना फ़ाइलों या फ़ोल्डरों पर प्रतिस्थापित करता है। –

1

अन्य समाधान:

$files = glob('../{,.}*', GLOB_BRACE); 
foreach ($files as $i => $file) { 
    if (is_dir($file)) { 
     unset($files[$i]); 
    } 
} 

या:

$files = glob('../{,.}*', GLOB_BRACE | GLOB_MARK); 
foreach ($files as $i => $file) { 
    if ($file[ strlen($file) - 1 ] == '/') { 
     unset($files[$i]); 
    } 
} 

दोनों संख्यात्मक कुंजियों की रक्षा तो आप शायद re-index करना चाहते हैं।

पीएस यदि आप get hidden files भी चाहते हैं तो आपको {,.}*', GLOB_BRACE का उपयोग करना होगा।

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

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