Listen Sie alle Dateien und Ordner in einem Verzeichnis mit der rekursiven PHP-Funktion auf

Lesezeit: 6 Minuten

Listen Sie alle Dateien und Ordner in einem Verzeichnis mit
Benutzer3412869

Ich versuche, alle Dateien in einem Verzeichnis durchzugehen, und wenn es ein Verzeichnis gibt, gehe durch alle seine Dateien und so weiter, bis es keine weiteren Verzeichnisse mehr gibt, zu denen ich wechseln kann. Jedes einzelne verarbeitete Element wird in der folgenden Funktion zu einem Ergebnisarray hinzugefügt. Es funktioniert nicht, obwohl ich nicht sicher bin, was ich tun kann/was ich falsch gemacht habe, aber der Browser läuft wahnsinnig langsam, wenn dieser Code unten verarbeitet wird. Jede Hilfe ist willkommen, danke!

Code:

    function getDirContents($dir){
        $results = array();
        $files = scandir($dir);

            foreach($files as $key => $value){
                if(!is_dir($dir. DIRECTORY_SEPARATOR .$value)){
                    $results[] = $value;
                } else if(is_dir($dir. DIRECTORY_SEPARATOR .$value)) {
                    $results[] = $value;
                    getDirContents($dir. DIRECTORY_SEPARATOR .$value);
                }
            }
    }

    print_r(getDirContents('/xampp/htdocs/WORK'));

  • RecursiveDirectoryIterator

    – u_mulder

    16. Juli 2014 um 14:49 Uhr

  • @ user3412869 Rufen Sie die Funktion nicht auf, wenn Sie dies getan haben . oder ... Siehe meine Antwort.

    – Sky Voyager

    16. Juli 2014 um 15:10 Uhr

1646582060 704 Listen Sie alle Dateien und Ordner in einem Verzeichnis mit
Sky Voyager

Holen Sie sich alle Dateien und Ordner in einem Verzeichnis, rufen Sie die Funktion nicht auf, wenn Sie sie haben . oder ...

Dein Code :

<?php
function getDirContents($dir, &$results = array()) {
    $files = scandir($dir);

    foreach ($files as $key => $value) {
        $path = realpath($dir . DIRECTORY_SEPARATOR . $value);
        if (!is_dir($path)) {
            $results[] = $path;
        } else if ($value != "." && $value != "..") {
            getDirContents($path, $results);
            $results[] = $path;
        }
    }

    return $results;
}

var_dump(getDirContents('/xampp/htdocs/WORK'));

Ausgabe (Beispiel):

array (size=12)
  0 => string '/xampp/htdocs/WORK/iframe.html' (length=30)
  1 => string '/xampp/htdocs/WORK/index.html' (length=29)
  2 => string '/xampp/htdocs/WORK/js' (length=21)
  3 => string '/xampp/htdocs/WORK/js/btwn.js' (length=29)
  4 => string '/xampp/htdocs/WORK/js/qunit' (length=27)
  5 => string '/xampp/htdocs/WORK/js/qunit/qunit.css' (length=37)
  6 => string '/xampp/htdocs/WORK/js/qunit/qunit.js' (length=36)
  7 => string '/xampp/htdocs/WORK/js/unit-test.js' (length=34)
  8 => string '/xampp/htdocs/WORK/xxxxx.js' (length=30)
  9 => string '/xampp/htdocs/WORK/plane.png' (length=28)
  10 => string '/xampp/htdocs/WORK/qunit.html' (length=29)
  11 => string '/xampp/htdocs/WORK/styles.less' (length=30)

  • Wäre es möglich, es so zu machen, dass jeder Ordner im Ergebnisarray ein eigenes Array enthält, das alle untergeordneten Dateien enthält?

    – Benutzer3412869

    16. Juli 2014 um 15:42 Uhr

  • Zeile 10 ersetzen durch: getDirContents($path, $results[$path]);

    – Sky Voyager

    16. Juli 2014 um 15:50 Uhr

  • Verwenden scandir() sieht nicht nach einer guten Idee aus, wenn die Leistung kritisch ist. Die bessere Option ist RecursiveDirectoryIterator (php.net/manual/en/class.recursivedirectoryiterator.php)

    – Mugoma J. Okomba

    19. Juni 2016 um 17:04 Uhr

  • Wenn das Verzeichnis leer ist, gibt die obige Funktion die Gesamtzahl 1 zurück

    – Ghulam Abbas

    29. Mai 2019 um 17:21 Uhr

  • verwenden realpath() gibt den Zielnamen von symbolischen Links im selben Verzeichnis an. Probieren Sie zum Beispiel das Beispiel auf “/usr/lib64” auf einem Linux-Rechner aus.

    – MattBianco

    24. Oktober 2019 um 10:55 Uhr

Listen Sie alle Dateien und Ordner in einem Verzeichnis mit
zkanoca

$rii = new RecursiveIteratorIterator(new RecursiveDirectoryIterator('path/to/folder'));

$files = array(); 

foreach ($rii as $file) {

    if ($file->isDir()){ 
        continue;
    }

    $files[] = $file->getPathname(); 

}



var_dump($files);

Dadurch erhalten Sie alle Dateien mit Pfaden.

  • Gibt es keine Möglichkeit, dies ohne das eingebaute Objekt zu tun?

    – Benutzer3412869

    16. Juli 2014 um 14:57 Uhr

  • Oder Sie können die Bedingung umkehren: if (!$file->isDir()) $files[] = $file->getPathname();. Um eine Zeile zu sparen.

    – Sky Voyager

    10. Februar 2016 um 12:53 Uhr

  • Man könnte das Continue auch durch using vermeiden RecursiveDirectoryIterator::SKIP_DOTS

    – Razvan Grigore

    8. März 2018 um 15:28 Uhr

  • Ändern Sie foreach in: $Regex = new RegexIterator($rii, '/^.+\.php$/i', RecursiveRegexIterator::GET_MATCH);

    – xayer

    20. Oktober 2019 um 12:26 Uhr


  • @RazvanGrigore Ich bin mir nicht sicher, wie das bei non hilft . und .. Verzeichnisse. Müssten Sie diese nicht immer noch herausfiltern?

    – War10ck

    13. Februar 2020 um 16:15 Uhr

1646582060 704 Listen Sie alle Dateien und Ordner in einem Verzeichnis mit
Sky Voyager

Dies ist eine Funktion, um alle Dateien und Ordner in einem Verzeichnis abzurufen RekursiverIteratorIterator.

Siehe Konstrukteursdokument: https://www.php.net/manual/en/recursiveiteratoriterator.construct.php

function getDirContents($path) {
    $rii = new RecursiveIteratorIterator(new RecursiveDirectoryIterator($path));

    $files = array(); 
    foreach ($rii as $file)
        if (!$file->isDir())
            $files[] = $file->getPathname();

    return $files;
}

var_dump(getDirContents($path));

  • Zkanocas Version ist in Ordnung, Ihre Antwort wird nicht wirklich benötigt, ein Kommentar zu seiner genügte. Dies kommt nur auf den Codierungsstil an.

    – Jonathan

    2. April 2017 um 5:49 Uhr

1646582063 8 Listen Sie alle Dateien und Ordner in einem Verzeichnis mit
bmatovu

Dies könnte hilfreich sein, wenn Sie Verzeichnisinhalte als Array abrufen möchten, wobei versteckte Dateien und Verzeichnisse ignoriert werden.

function dir_tree($dir_path)
{
    $rdi = new \RecursiveDirectoryIterator($dir_path);

    $rii = new \RecursiveIteratorIterator($rdi);

    $tree = [];

    foreach ($rii as $splFileInfo) {
        $file_name = $splFileInfo->getFilename();

        // Skip hidden files and directories.
        if ($file_name[0] === '.') {
            continue;
        }

        $path = $splFileInfo->isDir() ? array($file_name => array()) : array($file_name);

        for ($depth = $rii->getDepth() - 1; $depth >= 0; $depth--) {
            $path = array($rii->getSubIterator($depth)->current()->getFilename() => $path);
        }

        $tree = array_merge_recursive($tree, $path);
    }

    return $tree;
}

Das Ergebnis wäre so etwas wie;

dir_tree(__DIR__.'/public');

[
    'css' => [
        'style.css',
        'style.min.css',
    ],
    'js' => [
        'script.js',
        'script.min.js',
    ],
    'favicon.ico',
]

Quelle

1646582060 704 Listen Sie alle Dateien und Ordner in einem Verzeichnis mit
Sky Voyager

Holen Sie sich alle Dateien mit filter (2. Argument) und Ordner in einem Verzeichnis, rufen Sie die Funktion nicht auf, wenn Sie haben . oder ...

Dein Code :

<?php
function getDirContents($dir, $filter="", &$results = array()) {
    $files = scandir($dir);

    foreach($files as $key => $value){
        $path = realpath($dir.DIRECTORY_SEPARATOR.$value); 

        if(!is_dir($path)) {
            if(empty($filter) || preg_match($filter, $path)) $results[] = $path;
        } elseif($value != "." && $value != "..") {
            getDirContents($path, $filter, $results);
        }
    }

    return $results;
} 

// Simple Call: List all files
var_dump(getDirContents('/xampp/htdocs/WORK'));

// Regex Call: List php files only
var_dump(getDirContents('/xampp/htdocs/WORK', '/\.php$/'));

Ausgabe (Beispiel):

// Simple Call
array(13) {
  [0]=> string(69) "/xampp/htdocs/WORK.htaccess"
  [1]=> string(73) "/xampp/htdocs/WORKConverter.php"
  [2]=> string(69) "/xampp/htdocs/WORKEvent.php"
  [3]=> string(70) "/xampp/htdocs/WORKdefault_filter.json"
  [4]=> string(68) "/xampp/htdocs/WORKdefault_filter.xml"
  [5]=> string(80) "/xampp/htdocs/WORKCaching/ApcCache.php"
  [6]=> string(84) "/xampp/htdocs/WORKCaching/CacheFactory.php"
}

// Regex Call
array(13) {
  [0]=> string(69) "/xampp/htdocs/WORKEvent.php"
  [1]=> string(73) "/xampp/htdocs/WORKConverter.php"
  [2]=> string(80) "/xampp/htdocs/WORKCaching/ApcCache.php"
  [3]=> string(84) "/xampp/htdocs/WORKCaching/CacheFactory.php"
}

Vorschlag von James Cameron.

1646582067 459 Listen Sie alle Dateien und Ordner in einem Verzeichnis mit
patriziotomate

Mein Vorschlag ohne hässliche “foreach” Kontrollstrukturen ist

$iterator = new RecursiveIteratorIterator(new RecursiveDirectoryIterator($path));
$allFiles = array_filter(iterator_to_array($iterator), function($file) {
    return $file->isFile();
});

Möglicherweise möchten Sie nur den Dateipfad extrahieren, was Sie tun können, indem Sie:

array_keys($allFiles);

Immer noch 4 Codezeilen, aber einfacher als die Verwendung einer Schleife oder so.

1646582068 774 Listen Sie alle Dateien und Ordner in einem Verzeichnis mit
Kushik Das

Hier ist, was ich mir ausgedacht habe, und das mit nicht vielen Codezeilen

function show_files($start) {
    $contents = scandir($start);
    array_splice($contents, 0,2);
    echo "<ul>";
    foreach ( $contents as $item ) {
        if ( is_dir("$start/$item") && (substr($item, 0,1) != '.') ) {
            echo "<li>$item</li>";
            show_files("$start/$item");
        } else {
            echo "<li>$item</li>";
        }
    }
    echo "</ul>";
}

show_files('./');

Es gibt so etwas wie

..idea
.add.php
.add_task.php
.helpers
 .countries.php
.mysqli_connect.php
.sort.php
.test.js
.test.php
.view_tasks.php

** Die Punkte sind die Punkte der ungeordneten Liste.

Hoffe das hilft.

  • Da Sie zwei Jahre nach dem Stellen der Frage eine Antwort hinzugefügt haben: Warum sollte ich Ihre gegenüber der akzeptierten Antwort oder der idiomatischen RecursiveDirectorIterator-Lösung verwenden?

    – Gordon

    23. Mai 2016 um 6:40 Uhr

  • Ich habe erst vor ein paar Monaten angefangen, PHP zu lernen. Ich habe nach einer Lösung für diese Frage gesucht, aber auch versucht, eine eigene Lösung zu finden. Ich habe es gepostet und dachte, vielleicht hilft meine Lösung jemandem.

    – Koushik Das

    25. Mai 2016 um 2:53 Uhr

  • Die einzige, die für mich auf einer PHP-Website funktioniert hat, die auf einem IIS Windows 2012-Server basiert

    – Melomann

    18. Mai 2018 um 9:21 Uhr

957550cookie-checkListen Sie alle Dateien und Ordner in einem Verzeichnis mit der rekursiven PHP-Funktion auf

This website is using cookies to improve the user-friendliness. You agree by using the website further.

Privacy policy