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

86

Ich versuche, alle Dateien in einem Verzeichnis zu durchsuchen. Wenn ein Verzeichnis vorhanden ist, durchsuchen Sie alle Dateien usw., bis keine Verzeichnisse mehr verfügbar sind. Jedes verarbeitete Element wird in der folgenden Funktion 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 wird geschätzt, 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'));
user3412869
quelle
7
RecursiveDirectoryIterator
u_mulder
@ user3412869 Rufen Sie die Funktion nicht auf, wenn Sie .oder haben ... Siehe meine Antwort.
A-312

Antworten:

150

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

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)
A-312
quelle
Wäre es möglich, es so zu gestalten, dass jeder Ordner im Ergebnisarray ein eigenes Array enthält, das alle untergeordneten Dateien enthält?
user3412869
Ersetzen Sie Zeile 10 durch:getDirContents($path, $results[$path]);
A-312
1
Die Verwendung scandir()scheint keine gute Idee zu sein, wenn die Leistung kritisch ist. Die bessere Option ist RecursiveDirectoryIterator( php.net/manual/en/class.recursivedirectoryiterator.php )
Mugoma J. Okomba
Wenn das Verzeichnis leer ist, gibt die obige Funktion die Gesamtzahl 1 zurück
Ghulam Abbas,
using realpath()gibt den Zielnamen der symbolischen Links im selben Verzeichnis an. Versuchen Sie beispielsweise das Beispiel "/ usr / lib64" auf einem Linux-Computer.
MattBianco
105
$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.

zkanoca
quelle
Gibt es keine Möglichkeit, dies ohne das eingebaute Objekt zu tun?
user3412869
4
Oder Sie können die Bedingung umkehren : if (!$file->isDir()) $files[] = $file->getPathname();. Eine Zeile speichern.
A-312
7
Man könnte das Fortfahren
Razvan Grigore
Ändern Sie foreach zu:$Regex = new RegexIterator($rii, '/^.+\.php$/i', RecursiveRegexIterator::GET_MATCH);
xayer
@RazvanGrigore Ich bin mir nicht sicher, wie dies bei Nicht- .und ..Verzeichnissen hilft . Müssen Sie diese nicht noch herausfiltern?
War10ck
25

Es ist eine kürzere Version:

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));
A-312
quelle
7
Downvote, da dies keine wirkliche Verbesserung ist. Es ist nur die gleiche Antwort, die etwas anders geschrieben ist. Es kommt auf eine Frage des Stils an. Schutzklauseln (zkanocas Version) sind absolut in Ordnung.
Mermshaus
4
Zkanocas Version ist in Ordnung, Ihre Antwort wird nicht wirklich benötigt, ein Kommentar zu seiner war ausreichend. Dies hängt nur vom Codierungsstil ab.
Augwa
8

Holen Sie sich alle Dateien mit Filter (2. Argument) und Ordnern in ein Verzeichnis, rufen Sie keine Funktion auf, wenn Sie .oder haben ...

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"
}

James Camerons Vorschlag.

A-312
quelle
6

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, indem Sie Folgendes tun:

array_keys($allFiles);

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

Patriziotomato
quelle
1
Um zu vermeiden, dass alle Dateien und Verzeichnisse gleichzeitig in den Speicher geladen werden müssen, können Sie auch eine verwenden CallbackFilterIterator, die Sie später wiederholen können:$allFilesIterator = new CallbackFilterIterator($iterator, function(SplFileInfo $fileInfo) { return $fileInfo->isFile(); });
Aad Mathijssen
6

Dies kann hilfreich sein, wenn Sie Verzeichnisinhalte als Array abrufen und versteckte Dateien und Verzeichnisse ignorieren möchten.

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

bmatovu
quelle
3

Hier ist, was ich mir ausgedacht habe und dies ist 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 aus

..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 nicht geordneten Liste.

Hoffe das hilft.

Koushik Das
quelle
Da Sie zwei Jahre nach der Beantwortung der Frage eine Antwort hinzugefügt haben: Warum sollte ich Ihre Antwort anstelle der akzeptierten Antwort oder der idiomatischen RecursiveDirectorIterator-Lösung verwenden?
Gordon
Ich habe vor ein paar Monaten angefangen, PHP zu lernen. Ich suchte nach einer Lösung für diese Frage, versuchte aber auch, eine eigene Lösung zu finden. Ich habe es gepostet und dachte, wenn meine Lösung jemandem hilft.
Koushik Das
1
Die einzige, die für mich auf der PHP-Website auf Basis des IIS Windows 2012-Servers funktioniert hat
Meloman
3

Hier ist eine modifizierte Version von Hors Antwort, die für meinen Fall etwas besser funktioniert, da sie das Basisverzeichnis entfernt, das übergeben wird, und einen rekursiven Schalter hat, der auf false gesetzt werden kann, was ebenfalls praktisch ist. Um die Ausgabe besser lesbar zu machen, habe ich die Datei- und Unterverzeichnisdateien getrennt, sodass zuerst die Dateien und dann die Unterverzeichnisdateien hinzugefügt werden (siehe Ergebnis, was ich meine.)

Ich habe ein paar andere Methoden und Vorschläge ausprobiert und das ist, was ich am Ende hatte. Ich hatte bereits eine andere Arbeitsmethode, die sehr ähnlich war, aber anscheinend fehlschlug, wenn es ein Unterverzeichnis ohne Dateien gab, dieses Unterverzeichnis jedoch ein Unterverzeichnis mit Dateien hatte. Das Unterverzeichnis wurde nicht nach Dateien durchsucht , sodass möglicherweise einige Antworten getestet werden müssen für diesen Fall.) ... dachte sowieso, ich würde meine Version auch hier posten, falls jemand sucht ...

function get_filelist_as_array($dir, $recursive = true, $basedir = '', $include_dirs = false) {
    if ($dir == '') {return array();} else {$results = array(); $subresults = array();}
    if (!is_dir($dir)) {$dir = dirname($dir);} // so a files path can be sent
    if ($basedir == '') {$basedir = realpath($dir).DIRECTORY_SEPARATOR;}

    $files = scandir($dir);
    foreach ($files as $key => $value){
        if ( ($value != '.') && ($value != '..') ) {
            $path = realpath($dir.DIRECTORY_SEPARATOR.$value);
            if (is_dir($path)) {
                // optionally include directories in file list
                if ($include_dirs) {$subresults[] = str_replace($basedir, '', $path);}
                // optionally get file list for all subdirectories
                if ($recursive) {
                    $subdirresults = get_filelist_as_array($path, $recursive, $basedir, $include_dirs);
                    $results = array_merge($results, $subdirresults);
                }
            } else {
                // strip basedir and add to subarray to separate file list
                $subresults[] = str_replace($basedir, '', $path);
            }
        }
    }
    // merge the subarray to give the list of files then subdirectory files
    if (count($subresults) > 0) {$results = array_merge($subresults, $results);}
    return $results;
}

Ich nehme an, eine Sache, die Sie beachten sollten, um beim Aufrufen keinen $ basedir-Wert an diese Funktion zu übergeben ... Übergeben Sie meistens nur das $ dir (oder das Übergeben eines Dateipfads funktioniert jetzt auch) und optional $ recursive als false if and as erforderlich. Das Ergebnis:

[0] => demo-image.png
[1] => filelist.php
[2] => tile.png
[3] => 2015\header.png
[4] => 2015\08\background.jpg

Genießen! Okay, zurück zu dem Programm, in dem ich das tatsächlich verwende ...

UPDATE Zusätzliches Argument hinzugefügt, um Verzeichnisse in die Dateiliste aufzunehmen oder nicht (das Erinnern an andere Argumente muss übergeben werden, um dies zu verwenden.) ZB.

$results = get_filelist_as_array($dir, true, '', true);

Majick
quelle
Danke, aber diese Funktion listet keine Verzeichnisse auf. Nur Dateien
Deniz Porsuk
@ DenizPorsuk gute Abholung, muss das in der Frage zu der Zeit verpasst haben. Ich habe ein optionales Argument hinzugefügt, um Verzeichnisse einzuschließen oder nicht. :-)
Majick
2

Diese Lösung hat den Job für mich gemacht. Der RecursiveIteratorIterator listet alle Verzeichnisse und Dateien rekursiv, aber unsortiert auf. Das Programm filtert die Liste und sortiert sie.

Ich bin sicher, es gibt eine Möglichkeit, dies kürzer zu schreiben. Fühlen Sie sich frei, es zu verbessern. Es ist nur ein Code-Snippet. Vielleicht möchten Sie es für Ihre Zwecke aufpeppen.

<?php

$path = '/pth/to/your/directories/and/files';
// an unsorted array of dirs & files
$files_dirs = iterator_to_array( new RecursiveIteratorIterator(new RecursiveDirectoryIterator($path),RecursiveIteratorIterator::SELF_FIRST) );

echo '<html><body><pre>';
// create a new associative multi-dimensional array with dirs as keys and their files
$dirs_files = array();
foreach($files_dirs as $dir){
 if(is_dir($dir) AND preg_match('/\/\.$/',$dir)){
  $d = preg_replace('/\/\.$/','',$dir);
  $dirs_files[$d] = array();
  foreach($files_dirs as $file){
   if(is_file($file) AND $d == dirname($file)){
    $f = basename($file);
    $dirs_files[$d][] = $f;
   }
  }
 }
}
//print_r($dirs_files);

// sort dirs
ksort($dirs_files);

foreach($dirs_files as $dir => $files){
 $c = substr_count($dir,'/');
 echo  str_pad(' ',$c,' ', STR_PAD_LEFT)."$dir\n";
 // sort files
 asort($files);
 foreach($files as $file){
  echo str_pad(' ',$c,' ', STR_PAD_LEFT)."|_$file\n";
 }
}
echo '</pre></body></html>';

?>
chrinux
quelle
2

Die Lösung von @ A-312 kann Speicherprobleme verursachen, da sie ein großes Array erstellen kann, wenn sie /xampp/htdocs/WORKviele Dateien und Ordner enthält.

Wenn Sie PHP 7 haben, können Sie Generatoren verwenden und den Speicher von PHP wie folgt optimieren:

function getDirContents($dir) {
    $files = scandir($dir);
    foreach($files as $key => $value){

        $path = realpath($dir.DIRECTORY_SEPARATOR.$value);
        if(!is_dir($path)) {
            yield $path;

        } else if($value != "." && $value != "..") {
           yield from getDirContents($path);
           yield $path;
        }
    }
}

foreach(getDirContents('/xampp/htdocs/WORK') as $value) {
    echo $value."\n";
}

Ausbeute aus

Regen
quelle
1

Dadurch wird der vollständige Pfad aller Dateien im angegebenen Verzeichnis gedruckt. Sie können auch andere Rückruffunktionen an recursiveDir übergeben.

function printFunc($path){
    echo $path."<br>";
}

function recursiveDir($path, $fileFunc, $dirFunc){
    $openDir = opendir($path);
    while (($file = readdir($openDir)) !== false) {
        $fullFilePath = realpath("$path/$file");
        if ($file[0] != ".") {
            if (is_file($fullFilePath)){
                if (is_callable($fileFunc)){
                    $fileFunc($fullFilePath);
                }
            } else {
                if (is_callable($dirFunc)){
                    $dirFunc($fullFilePath);
                }
                recursiveDir($fullFilePath, $fileFunc, $dirFunc);
            }
        }
    }
}

recursiveDir($dirToScan, 'printFunc', 'printFunc');
Tom Chan
quelle
oder:realpath("$path/$file");
A-312
1

Dies ist eine kleine Modifikation von Majicks Antwort.
Ich habe gerade die von der Funktion zurückgegebene Array-Struktur geändert.

Von:

array() => {
    [0] => "test/test.txt"
}

Zu:

array() => {
    'test/test.txt' => "test.txt"
}

/**
 * @param string $dir
 * @param bool   $recursive
 * @param string $basedir
 *
 * @return array
 */
function getFileListAsArray(string $dir, bool $recursive = true, string $basedir = ''): array {
    if ($dir == '') {
        return array();
    } else {
        $results = array();
        $subresults = array();
    }
    if (!is_dir($dir)) {
        $dir = dirname($dir);
    } // so a files path can be sent
    if ($basedir == '') {
        $basedir = realpath($dir) . DIRECTORY_SEPARATOR;
    }

    $files = scandir($dir);
    foreach ($files as $key => $value) {
        if (($value != '.') && ($value != '..')) {
            $path = realpath($dir . DIRECTORY_SEPARATOR . $value);
            if (is_dir($path)) { // do not combine with the next line or..
                if ($recursive) { // ..non-recursive list will include subdirs
                    $subdirresults = self::getFileListAsArray($path, $recursive, $basedir);
                    $results = array_merge($results, $subdirresults);
                }
            } else { // strip basedir and add to subarray to separate file list
                $subresults[str_replace($basedir, '', $path)] = $value;
            }
        }
    }
    // merge the subarray to give the list of files then subdirectory files
    if (count($subresults) > 0) {
        $results = array_merge($subresults, $results);
    }
    return $results;
}

Könnte für diejenigen helfen, die genau die gleichen erwarteten Ergebnisse haben wie ich.

Max
quelle
1

Für wen braucht man zuerst Listendateien als Ordner (mit alphabetisch älteren).

Kann folgende Funktion verwenden. Dies ist keine selbstaufrufende Funktion. Sie haben also auch eine Verzeichnisliste, eine Verzeichnisansicht, eine Dateiliste und eine Ordnerliste als separates Array.

Ich verbringe zwei Tage dafür und möchte nicht, dass jemand seine Zeit dafür verschwendet, Hoffnung hilft jemandem.

function dirlist($dir){
    if(!file_exists($dir)){ return $dir.' does not exists'; }
    $list = array('path' => $dir, 'dirview' => array(), 'dirlist' => array(), 'files' => array(), 'folders' => array());

    $dirs = array($dir);
    while(null !== ($dir = array_pop($dirs))){
        if($dh = opendir($dir)){
            while(false !== ($file = readdir($dh))){
                if($file == '.' || $file == '..') continue;
                $path = $dir.DIRECTORY_SEPARATOR.$file;
                $list['dirlist_natural'][] = $path;
                if(is_dir($path)){
                    $list['dirview'][$dir]['folders'][] = $path;
                    // Bos klasorler while icerisine tekrar girmeyecektir. Klasorun oldugundan emin olalım.
                    if(!isset($list['dirview'][$path])){ $list['dirview'][$path] = array(); }
                    $dirs[] = $path;
                    //if($path == 'D:\Xampp\htdocs\exclusiveyachtcharter.localhost\wp-content\upgrade'){ press($path); press($list['dirview']); die; }
                }
                else{
                    $list['dirview'][$dir]['files'][] = $path;
                }
            }
            closedir($dh);
        }
    }

    // if(!empty($dirlist['dirlist_natural']))  sort($dirlist['dirlist_natural'], SORT_LOCALE_STRING); // delete safe ama gerek kalmadı.

    if(!empty($list['dirview'])) ksort($list['dirview']);

    // Dosyaları dogru sıralama yaptırıyoruz. Deniz P. - info[at]netinial.com
    foreach($list['dirview'] as $path => $file){
        if(isset($file['files'])){
            $list['dirlist'][] = $path;
            $list['files'] = array_merge($list['files'], $file['files']);
            $list['dirlist'] = array_merge($list['dirlist'], $file['files']);
        }
        // Add empty folders to the list
        if(is_dir($path) && array_search($path, $list['dirlist']) === false){
            $list['dirlist'][] = $path;
        }
        if(isset($file['folders'])){
            $list['folders'] = array_merge($list['folders'], $file['folders']);
        }
    }

    //press(array_diff($list['dirlist_natural'], $list['dirlist'])); press($list['dirview']); die;

    return $list;
}

wird so etwas ausgeben.

[D:\Xampp\htdocs\exclusiveyachtcharter.localhost] => Array
                (
                    [files] => Array
                        (
                            [0] => D:\Xampp\htdocs\exclusiveyachtcharter.localhost\.htaccess
                            [1] => D:\Xampp\htdocs\exclusiveyachtcharter.localhost\index.php
                            [2] => D:\Xampp\htdocs\exclusiveyachtcharter.localhost\license.txt
                            [3] => D:\Xampp\htdocs\exclusiveyachtcharter.localhost\php.php
                            [4] => D:\Xampp\htdocs\exclusiveyachtcharter.localhost\readme.html
                            [5] => D:\Xampp\htdocs\exclusiveyachtcharter.localhost\wp-activate.php
                            [6] => D:\Xampp\htdocs\exclusiveyachtcharter.localhost\wp-blog-header.php
                            [7] => D:\Xampp\htdocs\exclusiveyachtcharter.localhost\wp-comments-post.php
                            [8] => D:\Xampp\htdocs\exclusiveyachtcharter.localhost\wp-config-sample.php
                            [9] => D:\Xampp\htdocs\exclusiveyachtcharter.localhost\wp-config.php
                            [10] => D:\Xampp\htdocs\exclusiveyachtcharter.localhost\wp-cron.php
                            [11] => D:\Xampp\htdocs\exclusiveyachtcharter.localhost\wp-links-opml.php
                            [12] => D:\Xampp\htdocs\exclusiveyachtcharter.localhost\wp-load.php
                            [13] => D:\Xampp\htdocs\exclusiveyachtcharter.localhost\wp-login.php
                            [14] => D:\Xampp\htdocs\exclusiveyachtcharter.localhost\wp-mail.php
                            [15] => D:\Xampp\htdocs\exclusiveyachtcharter.localhost\wp-settings.php
                            [16] => D:\Xampp\htdocs\exclusiveyachtcharter.localhost\wp-signup.php
                            [17] => D:\Xampp\htdocs\exclusiveyachtcharter.localhost\wp-trackback.php
                            [18] => D:\Xampp\htdocs\exclusiveyachtcharter.localhost\xmlrpc.php
                        )

                    [folders] => Array
                        (
                            [0] => D:\Xampp\htdocs\exclusiveyachtcharter.localhost\exclusiv_excluwlsql
                            [1] => D:\Xampp\htdocs\exclusiveyachtcharter.localhost\wp-admin
                            [2] => D:\Xampp\htdocs\exclusiveyachtcharter.localhost\wp-content
                            [3] => D:\Xampp\htdocs\exclusiveyachtcharter.localhost\wp-includes
                        )

                )

Dirview-Ausgabe

    [dirview] => Array
        (
            [0] => D:\Xampp\htdocs\exclusiveyachtcharter.localhost\.htaccess
            [1] => D:\Xampp\htdocs\exclusiveyachtcharter.localhost\index.php
            [2] => D:\Xampp\htdocs\exclusiveyachtcharter.localhost\license.txt
            [3] => D:\Xampp\htdocs\exclusiveyachtcharter.localhost\php.php
            [4] => D:\Xampp\htdocs\exclusiveyachtcharter.localhost\readme.html
            [5] => D:\Xampp\htdocs\exclusiveyachtcharter.localhost\wp-activate.php
            [6] => D:\Xampp\htdocs\exclusiveyachtcharter.localhost\wp-blog-header.php
            [7] => D:\Xampp\htdocs\exclusiveyachtcharter.localhost\wp-comments-post.php
            [8] => D:\Xampp\htdocs\exclusiveyachtcharter.localhost\wp-config-sample.php
            [9] => D:\Xampp\htdocs\exclusiveyachtcharter.localhost\wp-config.php
            [10] => D:\Xampp\htdocs\exclusiveyachtcharter.localhost\wp-cron.php
            [11] => D:\Xampp\htdocs\exclusiveyachtcharter.localhost\wp-links-opml.php
            [12] => D:\Xampp\htdocs\exclusiveyachtcharter.localhost\wp-load.php
            [13] => D:\Xampp\htdocs\exclusiveyachtcharter.localhost\wp-login.php
            [14] => D:\Xampp\htdocs\exclusiveyachtcharter.localhost\wp-mail.php
            [15] => D:\Xampp\htdocs\exclusiveyachtcharter.localhost\wp-settings.php
            [16] => D:\Xampp\htdocs\exclusiveyachtcharter.localhost\wp-signup.php
            [17] => D:\Xampp\htdocs\exclusiveyachtcharter.localhost\wp-trackback.php
            [18] => D:\Xampp\htdocs\exclusiveyachtcharter.localhost\xmlrpc.php
            [19] => D:\Xampp\htdocs\exclusiveyachtcharter.localhost
            [20] => D:\Xampp\htdocs\exclusiveyachtcharter.localhost\exclusiv_excluwlsql\exclusiv_excluwl.sql
            [21] => D:\Xampp\htdocs\exclusiveyachtcharter.localhost\exclusiv_excluwlsql\exclusiv_excluwl.sql.zip
            [22] => D:\Xampp\htdocs\exclusiveyachtcharter.localhost\exclusiv_excluwlsql
)
Deniz Porsuk
quelle
1

Option für relativen Pfad hinzufügen:

function getDirContents($dir, $relativePath = false)
{
    $fileList = array();
    $iterator = new RecursiveIteratorIterator(new RecursiveDirectoryIterator($dir));
    foreach ($iterator as $file) {
        if ($file->isDir()) continue;
        $path = $file->getPathname();
        if ($relativePath) {
            $path = str_replace($dir, '', $path);
            $path = ltrim($path, '/\\');
        }
        $fileList[] = $path;
    }
    return $fileList;
}

print_r(getDirContents('/path/to/dir'));

print_r(getDirContents('/path/to/dir', true));

Ausgabe:

Array
(
    [0] => /path/to/dir/test1.html
    [1] => /path/to/dir/test.html
    [2] => /path/to/dir/index.php
)

Array
(
    [0] => test1.html
    [1] => test.html
    [2] => index.php
)
Trank
quelle
0

Hier ist mein :

function recScan( $mainDir, $allData = array() ) 
{ 
// hide files 
$hidefiles = array( 
".", 
"..", 
".htaccess", 
".htpasswd", 
"index.php", 
"php.ini", 
"error_log" ) ; 

//start reading directory 
$dirContent = scandir( $mainDir ) ; 

foreach ( $dirContent as $key => $content ) 
{ 
$path = $mainDir . '/' . $content ; 

// if is readable / file 
if ( ! in_array( $content, $hidefiles ) ) 
{ 
if ( is_file( $path ) && is_readable( $path ) ) 
{ 
$allData[] = $path ; 
} 

// if is readable / directory 
// Beware ! recursive scan eats ressources ! 
else 
if ( is_dir( $path ) && is_readable( $path ) ) 
{ 
/*recursive*/ 
$allData = recScan( $path, $allData ) ; 
} 
} 
} 

return $allData ; 
}  
Alin Razvan
quelle
0

hier habe ich beispiel dafür

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

<?php

/** List all the files and folders in a Directory csv(file) read with PHP recursive function */
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;
}





$files = getDirContents('/xampp/htdocs/medifree/lab');//here folder name where your folders and it's csvfile;


foreach($files as $file){
$csv_file =$file;
$foldername =  explode(DIRECTORY_SEPARATOR,$file);
//using this get your folder name (explode your path);
print_r($foldername);

if (($handle = fopen($csv_file, "r")) !== FALSE) {

fgetcsv($handle); 
while (($data = fgetcsv($handle, 1000, ",")) !== FALSE) {
$num = count($data);
for ($c=0; $c < $num; $c++) {
$col[$c] = $data[$c];
}
}
fclose($handle);
}

}

?>

http://myphpinformation.blogspot.in/2016/05/list-all-files-and-folders-in-directory-csv-file-read-with-php-recursive.html

Jydipsinh Parmar
quelle
0

Ich habe mit einer Überprüfungsiteration den guten Code von Hors Sujet verbessert, um zu vermeiden, dass Ordner in das Ergebnisarray aufgenommen werden:

Funktion getDirContents ($ dir, & $ results = array ()) {

    $ files = scandir ($ dir);

    foreach ($ files als $ key => $ value) {
        $ path = realpath ($ dir.DIRECTORY_SEPARATOR. $ value);
        if (is_dir ($ path) == false) {
            $ results [] = $ path;
        }}
        sonst wenn ($ value! = "." && $ value! = "..") {
            getDirContents ($ path, $ results);
            if (is_dir ($ path) == false) {
                $ results [] = $ path;
            }}   
        }}
    }}
    $ results zurückgeben;

}}
römisch
quelle
0

Bereit zum Kopieren und Einfügen für allgemeine Anwendungsfälle, verbesserte / erweiterte Version einer Antwort oben :

function getDirContents(string $dir, int $onlyFiles = 0, string $excludeRegex = '~/\.git/~', int $maxDepth = -1): array {
    $results = [];
    $scanAll = scandir($dir);
    sort($scanAll);
    $scanDirs = []; $scanFiles = [];
    foreach($scanAll as $fName){
        if ($fName === '.' || $fName === '..') { continue; }
        $fPath = str_replace(DIRECTORY_SEPARATOR, '/', realpath($dir . '/' . $fName));
        if (strlen($excludeRegex) > 0 && preg_match($excludeRegex, $fPath . (is_dir($fPath) ? '/' : ''))) { continue; }
        if (is_dir($fPath)) {
            $scanDirs[] = $fPath;
        } elseif ($onlyFiles >= 0) {
            $scanFiles[] = $fPath;
        }
    }

    foreach ($scanDirs as $pDir) {
        if ($onlyFiles <= 0) {
            $results[] = $pDir;
        }
        if ($maxDepth !== 0) {
            foreach (getDirContents($pDir, $onlyFiles, $excludeRegex, $maxDepth - 1) as $p) {
                $results[] = $p;
            }
        }
    }
    foreach ($scanFiles as $p) {
        $results[] = $p;
    }

    return $results;
}

Und wenn Sie relative Pfade benötigen:

function updateKeysWithRelPath(array $paths, string $baseDir, bool $allowBaseDirPath = false): array {
    $results = [];
    $regex = '~^' . preg_quote(str_replace(DIRECTORY_SEPARATOR, '/', realpath($baseDir)), '~') . '(?:/|$)~s';
    $regex = preg_replace('~/~', '/(?:(?!\.\.?/)(?:(?!/).)+/\.\.(?:/|$))?(?:\.(?:/|$))*', $regex); // limited to only one "/xx/../" expr
    if (DIRECTORY_SEPARATOR === '\\') {
        $regex = preg_replace('~/~', '[/\\\\\\\\]', $regex) . 'i';
    }
    foreach ($paths as $p) {
        $rel = preg_replace($regex, '', $p, 1);
        if ($rel === $p) {
            throw new \Exception('Path relativize failed, path "' . $p . '" is not within basedir "' . $baseDir . '".');
        } elseif ($rel === '') {
            if (!$allowBaseDirPath) {
                throw new \Exception('Path relativize failed, basedir path "' . $p . '" not allowed.');
            } else {
                $results[$rel] = './';
            }
        } else {
            $results[$rel] = $p;
        }
    }
    return $results;
}

function getDirContentsWithRelKeys(string $dir, int $onlyFiles = 0, string $excludeRegex = '~/\.git/~', int $maxDepth = -1): array {
    return updateKeysWithRelPath(getDirContents($dir, $onlyFiles, $excludeRegex, $maxDepth), $dir);
}

Diese Version löst / verbessert:

  1. Warnungen, realpathwenn PHP open_basedirdas ..Verzeichnis nicht abdeckt .
  2. verwendet keine Referenz für das Ergebnisarray
  3. Ermöglicht das Ausschließen von Verzeichnissen und Dateien
  4. erlaubt nur das Auflisten von Dateien / Verzeichnissen
  5. ermöglicht die Begrenzung der Suchtiefe
  6. Die Ausgabe wird immer zuerst nach Verzeichnissen sortiert (damit Verzeichnisse in umgekehrter Reihenfolge entfernt / geleert werden können).
  7. ermöglicht das Abrufen von Pfaden mit relativen Schlüsseln
  8. schwer optimiert für hunderttausende oder sogar millionen von dateien
  9. schreibe für mehr in den Kommentaren :)

Beispiele:

// list only `*.php` files and skip .git/ and the current file
$onlyPhpFilesExcludeRegex = '~/\.git/|(?<!/|\.php)$|^' . preg_quote(str_replace(DIRECTORY_SEPARATOR, '/', realpath(__FILE__)), '~') . '$~is';

$phpFiles = getDirContents(__DIR__, 1, $onlyPhpFilesExcludeRegex);
print_r($phpFiles);

// with relative keys
$phpFiles = getDirContentsWithRelKeys(__DIR__, 1, $onlyPhpFilesExcludeRegex);
print_r($phpFiles);

// with "include only" regex to include only .html and .txt files with "/*_mails/en/*.(html|txt)" path
'~/\.git/|^(?!.*/(|' . '[^/]+_mails/en/[^/]+\.(?:html|txt)' . ')$)~is'
mvorisek
quelle