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?

DexterW
quelle
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
Dies funktioniert: halgatewood.com/free-php-list-files-in-a-directory-script
InTheNameOfScience
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) {
    ...
}
Tatu Ulmanen
quelle
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.

Ilija
quelle
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 />';
}
Mike Moore
quelle
14

Einfach benutzen glob('*'). Hier ist die Dokumentation

Fletcher Moore
quelle
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.
Aliweb
quelle
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/>";
}
YooRich.com
quelle
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>";
    }
}
TheCrazyProfessor
quelle
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);
ircmaxell
quelle
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 )
);
Danijel
quelle
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>";
} 
Ad Kahn
quelle
0

Hier ist ein erweitertes Beispiel für die Anzeige aller Dateien in einem Ordner

m1crdy
quelle
Sie sollten hier Code anzeigen und darauf verweisen.
Kamranbhatti585
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>";
?>
Merrais
quelle
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
            */
        }
    }
}
Prashant Goel
quelle