PHP के साथ एक निर्देशिका में सभी फ़ाइलों के नाम प्राप्त करना


87

किसी कारण से, मुझे इस कोड के साथ फ़ाइल नामों के लिए एक '1' मिल रहा है:

if (is_dir($log_directory))
{
    if ($handle = opendir($log_directory))
    {
        while($file = readdir($handle) !== FALSE)
        {
            $results_array[] = $file;
        }
        closedir($handle);
    }
}

जब मैं $ results_array में प्रत्येक तत्व को प्रतिध्वनित करता हूं, तो मुझे '1' का एक गुच्छा मिलता है, न कि फ़ाइल का नाम। मुझे फ़ाइलों का नाम कैसे मिलेगा?


1
ग्लोब का उपयोग करते हुए कुछ विकल्प हैं ।
रात्रि प्रवास


1
पोस्टर की समस्या यह थी कि असाइनमेंट की प्राथमिकता बहुत कम है, इसलिए '! ==' ऑपरेटर का पहले मूल्यांकन किया जाता है और फिर उस ऑपरेशन के द्विआधारी परिणाम को $ फ़ाइल को सौंपा जाता है। केवल फिक्स की जरूरत है ($ फ़ाइल = रीडडीयर ($ हैंडल)) का उपयोग करने के लिए! == FALSE "
ओमनी


69 वोट से 70 तक। मुझे हांक मूडी के विपरीत महसूस होता है
चार्ली

जवाबों:


167

globइसके बजाय खुले / वाचिक और उपयोग से परेशान न हों :

foreach(glob($log_directory.'/*.*') as $file) {
    ...
}

24
आप array_filter(..., 'is_file')उस ग्लोब के चारों ओर लपेटना चाह सकते हैं क्योंकि प्रश्न फ़ाइलों के लिए पूछता है।
सालाथे 27’10

23
सभी फ़ाइलनामों में ऐसा नहीं है *.*: केवल *इसके बजाय उपयोग करें ।
जेम्सफिशर

एक्सटेंशन की सूची में हम सभी फाइलें कैसे प्राप्त कर सकते हैं? उदा। अगर हम सभी .php और .js फाइलें चाहते हैं?
निस

3
हाँ, यह उत्तर बहुत मजबूत नहीं है। फ़ाइलों को एक्सटेंशन की आवश्यकता नहीं है और निर्देशिकाओं का नाम दिया जा सकता है something.something। यह उपयोग करने के लिए बेहतर है array_filterऔर glob($log_directory.'/*')
एंड्रयू

मैंने इस कारण को रद्द कर दिया है मुझे बस सरल उत्तर की आवश्यकता थी और मेरे उपयोग के मामले की सभी प्रासंगिक फाइलें होंगी *.*। एक अधिक मजबूत अभिव्यक्ति इसे और भी बेहतर उत्तर देगी।
टेकब्रैट

49

एसपीएल शैली:

foreach (new DirectoryIterator(__DIR__) as $file) {
  if ($file->isFile()) {
      print $file->getFilename() . "\n";
  }
}

उपलब्ध विधियों की सूची के लिए DirectoryIterator और SplFileInfo कक्षाओं की जाँच करें जिनका आप उपयोग कर सकते हैं।


पूरे रास्ते के बजाय सिर्फ फाइलें और सिर्फ उनके नाम पाने के लिए शानदार तरीका, धन्यवाद!
क्रिस

1
हाँ। पूर्ण पथों के लिए, आप उपयोग कर सकते हैं getPathname: php.net/manual/en/splfileinfo.getpathname.php
Ilija

18

आपको $file = readdir($handle)कोष्ठक के साथ घेरने की आवश्यकता है।

हेयर यू गो:

$log_directory = 'your_dir_name_here';

$results_array = array();

if (is_dir($log_directory))
{
        if ($handle = opendir($log_directory))
        {
                //Notice the parentheses I added:
                while(($file = readdir($handle)) !== FALSE)
                {
                        $results_array[] = $file;
                }
                closedir($handle);
        }
}

//Output findings
foreach($results_array as $value)
{
    echo $value . '<br />';
}


14

जैसा कि स्वीकृत उत्तर में दो महत्वपूर्ण कमी हैं, मैं उन नए साथियों के लिए बेहतर उत्तर पोस्ट कर रहा हूं जो एक सही उत्तर की तलाश में हैं:

foreach (array_filter(glob('/Path/To/*'), 'is_file') as $file)
{
    // Do something with $file
}
  1. globeफ़ंक्शन के परिणामों को फ़िल्टर करना is_fileआवश्यक है, क्योंकि यह कुछ निर्देशिकाओं को भी वापस कर सकता है।
  2. सभी फ़ाइलों .में उनके नाम नहीं हैं, इसलिए */*पैटर्न सामान्य रूप से बेकार है।

यह एक साफ निष्पादन है जो मेरे लिए काम करता है। पिछले उत्तरों ने परिणाम में निर्देशिका दिखाई जो मैं नहीं चाहता था।
AWP

आप साहब को और अपवोट चाहिए! वास्तव में (विंडोज़ पर) मुझे basename($file)फ़ाइलनाम के साथ पूरे पथ के बजाय केवल फ़ाइल नाम प्राप्त करने के लिए उपयोग करना था ।
पाउलोको

10

मेरे पास इससे छोटा कोड है:

$path = "Pending2Post/";
$files = scandir($path);
foreach ($files as &$value) {
    echo "<a href='http://localhost/".$value."' target='_blank' >".$value."</a><br/><br/>";
}

मुझे सभी फाइलों को वापस करना लेकिन दो कचरा फाइलें "नाम।" तथा ".."। मेरे पास कोई फ़ाइल नहीं है जिसका नाम "है।" और मेरी निर्देशिका में ".."।
कामरानभट्टी

1
$ फ़ाइलों का उपयोग करें = array_diff (स्कैंडिर ($ पथ), सरणी ('।', '..')); उपरोक्त त्रुटियों को मुक्त करने के लिए मैंने चर्चा की।
कामरानभट्टी

अच्छा लगा। मैं फ़ाइलों के लिए एक्सटेंशन कैसे निकालूं? (मुझे .phpप्रत्येक फ़ाइल को हटाने की आवश्यकता है ।)
केएसपीआर

8

कुछ ओएस पर आप प्राप्त . ..और .DS_Store, ठीक है हम उन्हें उपयोग नहीं कर सकते तो चलो हमें उन्हें छिपाने के हैं।

सबसे पहले, फाइलों के बारे में सभी जानकारी प्राप्त करना शुरू करें scandir()

// Folder where you want to get all files names from
$dir = "uploads/";

/* Hide this */
$hideName = array('.','..','.DS_Store');    

// Sort in ascending order - this is default
$files = scandir($dir);
/* While this to there no more files are */
foreach($files as $filename) {
    if(!in_array($filename, $hideName)){
       /* echo the name of the files */
       echo "$filename<br>";
    }
}

4

यह ऑपरेटर के पूर्वाग्रह के कारण है। इसे बदलने का प्रयास करें:

while(($file = readdir($handle)) !== FALSE)
{
    $results_array[] = $file;
}
closedir($handle);

2

glob()और FilesystemIteratorउदाहरण:

/* 
 * glob() examples
 */

// get the array of full paths
$result = glob( 'path/*' );

// get the array of file names
$result = array_map( function( $item ) {
    return basename( $item );
}, glob( 'path/*' ) );


/* 
 * FilesystemIterator examples
 */

// get the array of file names by using FilesystemIterator and array_map()
$result = array_map( function( $item ) {
    // $item: SplFileInfo object
    return $item->getFilename();
}, iterator_to_array( new FilesystemIterator( 'path' ), false ) );

// get the array of file names by using FilesystemIterator and iterator_apply() filter
$it = new FilesystemIterator( 'path' );
iterator_apply( 
    $it, 
    function( $item, &$result ) {
        // $item: FilesystemIterator object that points to current element
        $result[] = (string) $item;
        // The function must return TRUE in order to continue iterating
        return true;
    }, 
    array( $it, &$result )
);

1

आप बस scandir(Path)फ़ंक्शन आज़मा सकते हैं । यह तेज और लागू करने में आसान है

वाक्य - विन्यास:

$files = scandir("somePath");

यह फ़ंक्शन एक सरणी में फ़ाइल की सूची देता है।

परिणाम देखने के लिए, आप कोशिश कर सकते हैं

var_dump($files);

या

foreach($files as $file)
{ 
echo $file."< br>";
} 

1

निर्देशिका और फ़ाइलों को सूचीबद्ध करने का एक और तरीका RecursiveTreeIteratorयहां दिए गए उत्तर का उपयोग करना होगा : https://stackoverflow.com/a/37548504/2032235

RecursiveIteratorIteratorPHP में और पुनरावृत्तियों का गहन विवरण यहां पाया जा सकता है: https://stackoverflow.com/a/12236744/2032235



0

मैं सिर्फ इस कोड का उपयोग करता हूं:

<?php
    $directory = "Images";
    echo "<div id='images'><p>$directory ...<p>";
    $Files = glob("Images/S*.jpg");
    foreach ($Files as $file) {
        echo "$file<br>";
    }
    echo "</div>";
?>


0

निर्देशिका में निहित सभी फ़ाइल ('$ पथ' में निर्देशिका का पथ होता है) का पता लगाने के लिए पुनरावर्ती कोड:

function explore_directory($path)
{
    $scans = scandir($path);

    foreach($scans as $scan)
    {
        $new_path = $path.$scan;

        if(is_dir($new_path))
        {
            $new_path = $new_path."/";
            explore_directory($new_path);
        }
        else // A file
        {
            /*
                  Body of code
            */
        }
    }
}
हमारी साइट का प्रयोग करके, आप स्वीकार करते हैं कि आपने हमारी Cookie Policy और निजता नीति को पढ़ और समझा लिया है।
Licensed under cc by-sa 3.0 with attribution required.