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.