PHP स्क्रिप्ट एक निर्देशिका में सभी फ़ाइलों के माध्यम से लूप करने के लिए?


131

मैं एक PHP स्क्रिप्ट की तलाश कर रहा हूं, जो एक डायरेक्टरी में सभी फाइलों से गुजरती है, इसलिए मैं फाइलनेम के साथ चीजें कर सकता हूं, जैसे कि फॉर्मेट, प्रिंट या इसे लिंक से जोड़ना। मैं फ़ाइलों को नाम, प्रकार या दिनांक के आधार पर निर्मित / जोड़ा / संशोधित करने में सक्षम होना चाहूंगा। (फैंटेसी डायरेक्टरी "इंडेक्स" सोचें।) मैं फाइलों की सूची में अपवर्जन को जोड़ने में सक्षम होना चाहूंगा, जैसे कि स्क्रिप्ट या अन्य "सिस्टम" फाइलें। ( .और .."निर्देशिका" की तरह।)

होने के नाते मैं स्क्रिप्ट को संशोधित करने में सक्षम होना चाहता हूं, मुझे PHP डॉक्स को देखने और खुद को लिखने का तरीका सीखने में अधिक रुचि है। यदि कोई मौजूदा स्क्रिप्ट, ट्यूटोरियल और व्हाट्सएप हैं, तो कृपया मुझे बताएं।


जवाबों:


245

आप DirectoryIterator का उपयोग कर सकते हैं । Php मैनुअल से उदाहरण:

<?php
$dir = new DirectoryIterator(dirname(__FILE__));
foreach ($dir as $fileinfo) {
    if (!$fileinfo->isDot()) {
        var_dump($fileinfo->getFilename());
    }
}
?>

3
नोट: कई सर्वरों में SPL स्थापित नहीं है, इसलिए आप DirectoryIterator वर्ग (नीचे मेरी वैकल्पिक पोस्ट देखें) का उपयोग नहीं कर पाएंगे। यदि आप कर सकते हैं, तो यह प्रयोग करें!
NexusR

4
नोट [2]: सुनिश्चित करें कि आप समझते हैं कि dirname()ऊपर दिए गए फ़ंक्शन को आपके द्वारा वहां रखे गए पथ का मूल फ़ोल्डर मिल जाएगा। मेरे मामले में, मैंने माना कि निर्देशिका नाम / पथ के लिए dirname एक आवरण था, इसलिए इसकी आवश्यकता नहीं थी।
willdanceforfun

इसके अलावा, अगर dirname यह एक बड़ा फाइल सिस्टम है, तो मेमोरी के साथ समस्याएं स्पष्ट हैं। फ़ाइलों के 1 मिली के साथ मेरे मामले में, ऐप को मेमोरी_लिमिट पर ~ 512M RAM की आवश्यकता है।
8

1
यदि आपको /home/examples/banana.jpgउपयोग की तरह पूर्ण पथ की आवश्यकता है$fileinfo->getPathname()
mg33

आप निर्देशिका पर कार्रवाई से बचने के लिए $ fileinfo-> isDir () का उपयोग कर सकते हैं
LeChatNoir

44

यदि आपके पास DirectoryIterator वर्ग तक पहुँच नहीं है, तो यह कोशिश करें:

<?php
$path = "/path/to/files";

if ($handle = opendir($path)) {
    while (false !== ($file = readdir($handle))) {
        if ('.' === $file) continue;
        if ('..' === $file) continue;

        // do something with the file
    }
    closedir($handle);
}
?>

4
क्या आप ऐसी स्थिति का नाम बता सकते हैं, जहां आपकी पहुंच नहीं होगी?
जोकेम कूइजपर्स

12
बहुत सारी विरासत अनुप्रयोग PHP 4 का उपयोग करते हैं, जिसमें DirectoryIterator की कोई पहुंच नहीं है।
जोसेफ कैलासर

1
क्यों '।' === $ फ़ाइल? यह जावा नहीं है।
डेव Heq

2
डेव ... नहींं यह डॉट्स से मेल खा रहा है और यह जारी नहीं रखता है कि क्या यह PHP में मेल नहीं खाता है। == और === के अंतर की खोज करें।
JSG

22

scandir()फ़ंक्शन का उपयोग करें :

<?php
    $directory = '/path/to/files';

    if (!is_dir($directory)) {
        exit('Invalid diretory path');
    }

    $files = array();
    foreach (scandir($directory) as $file) {
        if ($file !== '.' && $file !== '..') {
            $files[] = $file;
        }
    }

    var_dump($files);
?>

18

आप इसका उपयोग भी कर सकते हैं FilesystemIterator। इसके लिए भी कम कोड की आवश्यकता होती है DirectoryIterator, और स्वचालित रूप से हटा देता है .और ..

// Let's traverse the images directory
$fileSystemIterator = new FilesystemIterator('images');

$entries = array();
foreach ($fileSystemIterator as $fileInfo){
    $entries[] = $fileInfo->getFilename();
}

var_dump($entries);

//OUTPUT
object(FilesystemIterator)[1]

array (size=14)
  0 => string 'aa[1].jpg' (length=9)
  1 => string 'Chrysanthemum.jpg' (length=17)
  2 => string 'Desert.jpg' (length=10)
  3 => string 'giphy_billclinton_sad.gif' (length=25)
  4 => string 'giphy_shut_your.gif' (length=19)
  5 => string 'Hydrangeas.jpg' (length=14)
  6 => string 'Jellyfish.jpg' (length=13)
  7 => string 'Koala.jpg' (length=9)
  8 => string 'Lighthouse.jpg' (length=14)
  9 => string 'Penguins.jpg' (length=12)
  10 => string 'pnggrad16rgb.png' (length=16)
  11 => string 'pnggrad16rgba.png' (length=17)
  12 => string 'pnggradHDrgba.png' (length=17)
  13 => string 'Tulips.jpg' (length=10)

लिंक: http://php.net/manual/en/class.filesystemiterator.php


5

आप इस कोड का उपयोग किसी निर्देशिका के पुनरावर्ती रूप से करने के लिए कर सकते हैं :

$path = "/home/myhome";
$rdi = new RecursiveDirectoryIterator($path, RecursiveDirectoryIterator::KEY_AS_PATHNAME);
foreach (new RecursiveIteratorIterator($rdi, RecursiveIteratorIterator::SELF_FIRST) as $file => $info) {
    echo $file."\n";
}

2

ग्लोब () में सॉर्टिंग और पैटर्न मिलान के प्रावधान हैं। चूँकि रिटर्न वैल्यू एक एरे है, इसलिए आप अपनी ज़रूरत का हर काम कर सकते हैं।


1
यह अच्छा है जब तक आप बहुत सारी फ़ाइलों के साथ काम नहीं कर रहे हैं ...> 10,000। आप स्मृति से बाहर चलेंगे।
NexusR

@NexusRex: आप किसी डेटाबेस से 10,000 रिकॉर्ड या तो नहीं पढ़ रहे होंगे, लेकिन यह सवाल के दायरे से बाहर है
bcosca

माना! यदि डेटाबेस से पढ़ रहे हैं, तो आप "सीमा" के साथ पगति कर सकते हैं, लेकिन ऐसा कोई भाग्य नहीं है जब आपके पास इसे टाइप करने के लिए 5 मिलियन XML फ़ाइलों वाली निर्देशिका हो।
NexusRex 5:12

एसपीएल ग्लोबिलेटर है।
przemo_li

2

पूर्णता के लिए (चूंकि यह एक उच्च-ट्रैफ़िक पृष्ठ लगता है), चलो पुराने पुराने dir()फ़ंक्शन को न भूलें :

$entries = [];
$d = dir("/"); // dir to scan
while (false !== ($entry = $d->read())) { // mind the strict bool check!
    if ($entry[0] == '.') continue; // ignore anything starting with a dot
    $entries[] = $entry;
}
$d->close();
sort($entries); // or whatever desired

print_r($entries);
हमारी साइट का प्रयोग करके, आप स्वीकार करते हैं कि आपने हमारी Cookie Policy और निजता नीति को पढ़ और समझा लिया है।
Licensed under cc by-sa 3.0 with attribution required.