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.