Abrufen der Namen aller Dateien in einem Verzeichnis mit PHP


86

Aus irgendeinem Grund bekomme ich immer eine '1' für die Dateinamen mit diesem Code:

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

Wenn ich jedes Element in $ results_array wiedergebe, erhalte ich eine Reihe von Einsen, nicht den Namen der Datei. Wie erhalte ich den Namen der Dateien?


1
Es gibt einige Optionen mit glob .
— Allnightgrocery


1
Das Problem, das das Poster hatte, war, dass die Zuweisung eine sehr niedrige Priorität hat, sodass der Operator '! ==' zuerst ausgewertet wird und das binäre Ergebnis dieser Operation dann $ file zugewiesen wird. Die einzige Korrektur, die benötigt wird, ist die Verwendung von ($ file = readdir ($ handle))! == FALSE "
— Omn


von 69 Stimmen auf 70. Ich fühle mich wie das Gegenteil von Hank Moody
— Charlie

Antworten:


166

Kümmere dich nicht um open / readdir und benutze globstattdessen:

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

24
Möglicherweise möchten Sie array_filter(..., 'is_file')diesen Glob umschließen, da in der Frage nach Dateien gefragt wird.
— salathe

23
Nicht alle Dateinamen haben die Form *.*: Verwenden Sie *stattdessen einfach .
— Jameshfisher

Wie können wir alle Dateien in die Liste der Erweiterungen aufnehmen? ZB wenn wir alle .php und .js Dateien wollen?
— Nis

3
Ja, diese Antwort ist nicht sehr robust. Dateien müssen keine Erweiterungen haben und Verzeichnisse können benannt werden something.something. Es ist besser zu verwenden array_filterund glob($log_directory.'/*').
— Andrew

Ich habe dies positiv bewertet, weil ich nur die einfache Antwort brauchte und alle relevanten Dateien für meinen Anwendungsfall wären *.*. Ein robusterer Ausdruck würde dies zu einer noch besseren Antwort machen.
— TecBrat

49

SPL- Stil:

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

Überprüfen Sie die DirectoryIterator- und SplFileInfo- Klassen auf die Liste der verfügbaren Methoden, die Sie verwenden können.


Tolle Möglichkeit, nur Dateien und nur deren Namen anstelle des gesamten Pfads zu erhalten, danke!
— Chris

1
Ja. Für vollständige Pfade können Sie verwenden getPathname: php.net/manual/en/splfileinfo.getpathname.php
— Ilija

18

Sie müssen $file = readdir($handle)mit Klammern umgeben.

Bitte schön:

$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

Da die akzeptierte Antwort zwei wichtige Mängel aufweist, veröffentliche ich die verbesserte Antwort für diejenigen Neuankömmlinge, die nach einer richtigen Antwort suchen:

foreach (array_filter(glob('/Path/To/*'), 'is_file') as $file)
{
    // Do something with $file
}
  1. Filtern der globeFunktionsergebnisse mitis_file ist erforderlich, da möglicherweise auch einige Verzeichnisse zurückgegeben werden.
  2. Nicht alle Dateien haben einen .Namen, daher ist das */*Muster im Allgemeinen schlecht.

Dies ist eine saubere Ausführung, die für mich funktioniert hat. Frühere Antworten zeigten Verzeichnisse in Ergebnissen, die ich nicht wollte.
— AWP

Sie, mein Herr, brauchen mehr Upvotes! Eigentlich (unter Windows) musste ich verwenden basename($file), um nur den Dateinamen anstelle des gesamten Pfads mit Dateinamen zu erhalten.
— Pauloco

10

Ich habe kleineren Code, um dies zu tun:

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

Gibt mir alle Dateien außer zwei Mülldateien mit dem Namen "." Zurück. und "..". Ich habe keine Datei mit dem Namen "." und ".." in meinem Verzeichnis.
— Kamranbhatti585

1
Verwenden Sie $ files = array_diff (scandir ($ path), array ('.', '..')); Um die oben genannten Fehler zu beheben, habe ich darüber gesprochen.
— Kamranbhatti585

Nett. Wie entferne ich die Erweiterungen für die Dateien? (Ich muss .phpauf jeder Datei entfernen .)
— KSPR

8

Auf einigen Betriebssystemen erhalten Sie . ..und .DS_Store: Nun, wir können sie nicht verwenden, also lassen Sie uns sie verstecken.

Holen Sie sich zunächst alle Informationen zu den Dateien mit 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

Dies liegt an der Präzision des Bedieners. Versuchen Sie es zu ändern in:

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

2

glob()und FilesystemIteratorBeispiele:

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

Sie könnten einfach die scandir(Path)Funktion ausprobieren . es ist schnell und einfach zu implementieren

Syntax:

$files = scandir("somePath");

Diese Funktion gibt eine Liste von Dateien in ein Array zurück.

Um das Ergebnis anzuzeigen, können Sie versuchen

var_dump($files);

Oder

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



0

Ich benutze nur diesen Code:

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

Rekursiver Code zum Durchsuchen aller in einem Verzeichnis enthaltenen Dateien ('$ path' enthält den Pfad des Verzeichnisses):

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
            */
        }
    }
}
Durch die Nutzung unserer Website bestätigen Sie, dass Sie unsere Cookie-Richtlinie und Datenschutzrichtlinie gelesen und verstanden haben.
Licensed under cc by-sa 3.0 with attribution required.