Ottenere i nomi di tutti i file in una directory con PHP


88

Per qualche motivo, continuo a ricevere un "1" per i nomi dei file con questo codice:

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

Quando echo ogni elemento in $ results_array, ottengo un mucchio di '1', non il nome del file. Come ottengo il nome dei file?


1
Ci sono alcune opzioni usando glob .
allnightgrocery


1
Il problema riscontrato dal poster era che l'assegnazione ha una priorità molto bassa, quindi l'operatore '! ==' viene valutato per primo e il risultato binario di quell'operazione viene quindi assegnato a $ file. L'unica correzione necessaria è usare ($ file = readdir ($ handle))! == FALSE "
Omn


da 69 voti a 70. Mi sento come l'opposto di Hank Moody
Charlie

Risposte:


169

Non preoccuparti di open / readdir e usa globinvece:

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

24
Potresti voler avvolgere array_filter(..., 'is_file')quel glob poiché la domanda richiede file.
Salathe

23
Non tutti i nomi di file hanno la forma *.*: usa *invece.
jameshfisher

Come possiamo ottenere tutti i file nell'elenco delle estensioni? Ad esempio, se vogliamo tutti i file .php e .js?
Nis

3
Sì, questa risposta non è molto robusta. Non è necessario che i file abbiano estensioni e le directory possono essere denominate something.something. È meglio usare array_filtere glob($log_directory.'/*').
Andrew

Ho votato su questo perché avevo solo bisogno della semplice risposta e tutti i file rilevanti per il mio caso d'uso sarebbero stati *.*. Un'espressione più robusta renderebbe questa una risposta ancora migliore.
TecBrat


18

Devi racchiudere $file = readdir($handle)tra parentesi.

Ecco qui:

$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

Poiché la risposta accettata ha due importanti carenze, sto postando la risposta migliorata per quei nuovi arrivati ​​che sono alla ricerca di una risposta corretta:

foreach (array_filter(glob('/Path/To/*'), 'is_file') as $file)
{
    // Do something with $file
}
  1. È necessario filtrare i globerisultati della funzione con is_file, perché potrebbe restituire anche alcune directory.
  2. Non tutti i file hanno un .nome, quindi il */*pattern in generale fa schifo.

Questa è un'esecuzione pulita che ha funzionato per me. Le risposte precedenti mostravano directory con risultati che non volevo.
AWP

Signore, hai bisogno di più voti positivi! In realtà (su Windows) ho dovuto usare basename($file)per ottenere solo il nome del file invece dell'intero percorso con il nome del file.
Pauloco

11

Ho un codice più piccolo per fare questo:

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

Restituendomi tutti i file tranne due file spazzatura denominati "." e "..". Non ho alcun file denominato "." e ".." nella mia directory.
kamranbhatti585

1
Usa $ files = array_diff (scandir ($ path), array ('.', '..')); per liberare gli errori di cui sopra ho discusso.
kamranbhatti585

Bello. come rimuovo le estensioni per i file? (Devo rimuovere .phpsu ogni file.)
KSPR

8

Su alcuni sistemi operativi ottieni . ..e .DS_Store, beh, non possiamo usarli quindi nascondiamoli.

Per prima cosa ottieni tutte le informazioni sui file, usando 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

È dovuto alla precisione dell'operatore. Prova a cambiarlo in:

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

2

glob()ed FilesystemIteratoresempi:

/* 
 * 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

Potresti semplicemente provare la scandir(Path)funzione. è veloce e facile da implementare

Sintassi:

$files = scandir("somePath");

Questa funzione restituisce un elenco di file in un array.

per visualizzare il risultato, puoi provare

var_dump($files);

O

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


0

Uso solo questo codice:

<?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

Codice ricorsivo per esplorare tutto il file contenuto in una directory ('$ path' contiene il percorso della directory):

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
            */
        }
    }
}
Utilizzando il nostro sito, riconosci di aver letto e compreso le nostre Informativa sui cookie e Informativa sulla privacy.
Licensed under cc by-sa 3.0 with attribution required.