Перелічіть усі файли та папки в Каталозі з рекурсивною функцією PHP


84

Я намагаюся переглянути всі файли в каталозі, і якщо каталог є, перегляньте всі його файли і так далі, поки не залишиться більше каталогів, куди можна перейти. Кожен оброблений елемент буде доданий до масиву результатів у функції нижче. Це не працює, хоча я не впевнений, що я можу зробити / що я зробив неправильно, але браузер працює шалено повільно, коли обробляється цей код нижче, будь-яка допомога буде вдячна, дякую!

Код:

    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'));

7
RecursiveDirectoryIterator
u_mulder

@ user3412869 Не викликати функцію, якщо у вас є .або ... Дивіться мою відповідь.
A-312,

Відповіді:


148

Отримайте всі файли та папки в каталозі, не викликайте функцію, коли у вас є .або ...

Ваш код:

<?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'));

Результат (приклад):

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)

Чи можна було б зробити так, щоб кожна папка в масиві результатів, чи є у власному масиві всі дочірні файли?
user3412869

Замінити рядок 10 на:getDirContents($path, $results[$path]);
A-312

1
Використання scandir()не виглядає як хороша ідея, коли продуктивність є критичною. Кращим варіантом є RecursiveDirectoryIterator( php.net/manual/en/class.recursivedirectoryiterator.php )
Mugoma J. Okomba

коли каталог порожній, то над функцією повертається загальна кількість 1
Гулам Аббас

використання realpath()дасть цільову назву символічних посилань в тому ж каталозі. Спробуйте приклад, наприклад, на "/ usr / lib64" на машині Linux.
MattBianco

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

$files = array(); 

foreach ($rii as $file) {

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

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

}



var_dump($files);

Це принесе вам усі файли із шляхами.


Чи неможливо це зробити без вбудованого об’єкта?
user3412869

4
Або ви можете змінити умову: if (!$file->isDir()) $files[] = $file->getPathname(); . Щоб зберегти один рядок.
A-312,

7
Можна також уникнути продовження, використовуючи RecursiveDirectoryIterator :: SKIP_DOTS
Razvan Grigore

Змінити foreach на:$Regex = new RegexIterator($rii, '/^.+\.php$/i', RecursiveRegexIterator::GET_MATCH);
xayer

@RazvanGrigore Я не впевнений, як це допомагає з не .та ..каталогами. Вам все одно не потрібно буде їх відфільтрувати?
War10ck

25

Це коротша версія:

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));

7
Проголосуйте проти, оскільки це насправді не є покращенням. Це просто та сама відповідь, написана дещо інакше. Зводиться до питання стилю. Застережні речення (версія zkanoca) абсолютно чудові.
mermshaus

4
Версія Zkanoca чудова, ваша відповідь насправді не потрібна, коментаря було достатньо щодо його. Це зводиться лише до стилю кодування.
Augwa

8

Отримайте всі файли з фільтром (2-й аргумент) та папками в каталозі, не викликайте функцію, коли у вас є .або ...

Ваш код:

<?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$/'));

Результат (приклад):

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

Пропозиція Джеймса Кемерона.


5

Моя пропозиція без потворних структур управління "foreach" є

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

Можливо, вам захочеться лише витягти шлях до файлу, для чого ви можете:

array_keys($allFiles);

Все-таки 4 рядки коду, але більш прямолінійні, ніж використання циклу чи чогось іншого.


1
Щоб уникнути необхідності завантажувати всі файли та каталоги в пам'ять одночасно, ви також можете скористатися CallbackFilterIterator$allFilesIterator = new CallbackFilterIterator($iterator, function(SplFileInfo $fileInfo) { return $fileInfo->isFile(); });
файлом,

5

Це може допомогти, якщо ви хочете отримати вміст каталогів як масив, ігноруючи приховані файли та каталоги.

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

Результатом буде щось на зразок;

dir_tree(__DIR__.'/public');

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

Джерело


3

Ось те, що я придумав, і це не так багато рядків коду

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('./');

Виходить щось на зразок

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

** Крапки - це крапки неупорядкованого списку.

Сподіваюся, це допомагає.


Оскільки ви додали відповідь через два роки після того, як було поставлено запитання: чому я хотів би використовувати вашу замість прийнятої відповіді чи ідіоматичного рішення RecursiveDirectorIterator?
Гордон,

Я почав вивчати PHP лише кілька місяців тому. Я шукав рішення з цього питання, але намагався придумати і своє власне рішення. Я розмістив його, думаючи, що, можливо, якщо моє рішення комусь допоможе.
Koushik Das

1
Єдиний, хто працював у мене на веб-сайті PHP на базі сервера IIS Windows 2012
Меломан

3

Ось модифікована версія відповіді Хорса, працює трохи краще для мого випадку, оскільки вона вилучає базовий каталог, який передається в ході, і має рекурсивний перемикач, який можна встановити на false, що також зручно. Крім того, щоб зробити вихідні дані більш читабельними, я розділив файли та файли підкаталогів, тому файли додаються спочатку, а потім файли підкаталогу (див. Результат, що я маю на увазі.)

Я спробував кілька інших методів та пропозицій, і ось з чим я закінчив. У мене був ще один робочий метод, який був дуже схожий, але, здавалося, не вдався там, де був підкаталог без файлів, але цей підкаталог мав підкаталог із файлами, він не сканував підкаталог на наявність файлів - тому деякі відповіді, можливо, доведеться перевірити для цього випадку.) ... у будь-якому випадку думав, що я також опублікую тут свою версію на випадок, якщо хтось шукає ...

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

Я гадаю, одне слід бути обережним, щоб не передавати значення $ basedir цій функції під час її виклику ... в основному просто передайте $ dir (або передача шляху до файлу теж буде працювати зараз) і, за бажанням, $ рекурсивний як false, якщо і як потрібні. Результат:

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

Насолоджуйтесь! Гаразд, повернімось до програми, якою я насправді користуюся ...

ОНОВЛЕННЯ Додано додатковий аргумент для включення каталогів до списку файлів чи ні (пам'ятаючи інші аргументи, потрібно буде передавати, щоб використовувати це.), Напр.

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


Дякую, але ця функція не містить каталогів. Тільки файли
Деніз Порсук

@DenizPorsuk хороший пікап, мабуть, пропустив це у питанні на той момент. Я додав необов’язковий аргумент для включення каталогів чи ні. :-)
majick

2

Це рішення зробило роботу за мене. RecursiveIteratorIterator перераховує всі каталоги та файли рекурсивно, але не сортується. Програма фільтрує список і сортує його.

Я впевнений, що є спосіб написати це коротше; сміливо вдосконалюйте його. Це лише фрагмент коду. Можливо, ви захочете звести його до своїх цілей.

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

?>

2

Рішення @ A-312 може спричинити проблеми з пам'яттю, оскільки може створити величезний масив, якщо /xampp/htdocs/WORKмістить багато файлів та папок.

Якщо у вас PHP 7, ви можете використовувати генератори та оптимізувати пам'ять PHP так:

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

врожайність від


1

Після цього буде надруковано повний шлях до всіх файлів у вказаному каталозі, ви також можете передати інші функції зворотного виклику в rekurzivniDir.

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');

або:realpath("$path/$file");
A-312

1

Це невелика модифікація відповіді майка .
Я щойно змінив структуру масиву, яку повертає функція.

Від:

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

Кому:

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

Може допомогти тим, хто має такі ж очікувані результати, як я.


1

Кому потрібні файли списків першими, ніж папки (з алфавітом старше)

Можна використовувати наступну функцію. Це не функція самовиклику. Таким чином, у вас буде також список каталогів, перегляд каталогів, список файлів і список папок як відокремлений масив.

Я витрачаю на це два дні і не хочу, щоб хтось також витрачав на це час, надія комусь допомагає.

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

виведе щось подібне.

[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

    [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
)

1

Додати варіант відносного шляху:

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));

Вихід:

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
)

0

Ось мій:

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

0

ось у мене є приклад для цього

Перелічіть усі файли та папки в каталозі csv (файл), прочитаний за допомогою рекурсивної функції PHP

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


0

Я покращив однією ітерацією перевірки хороший код Hors Sujet, щоб уникнути включення папок в масив результатів:

функція getDirContents ($ dir, & $ results = array ()) {

    $ файлів = scandir ($ dir);

    foreach ($ файли як $ key => $ value) {
        $ path = реальний шлях ($ dir.DIRECTORY_SEPARATOR. $ value);
        if (is_dir ($ path) == false) {
            $ результати [] = $ шлях;
        }
        інакше якщо ($ value! = "." && $ value! = "..") {
            getDirContents ($ шлях, $ результати);
            if (is_dir ($ path) == false) {
                $ результати [] = $ шлях;
            }   
        }
    }
    повернути $ результати;

}

0

Готова до функції копіювання та вставки для поширених випадків використання, покращена / розширена версія однієї відповіді вище :

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

А якщо вам потрібні відносні шляхи:

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);
}

Ця версія вирішує / вдосконалює:

  1. попередження, realpathколи PHP open_basedirне охоплює ..каталог.
  2. не використовує посилання на масив результатів
  3. дозволяє виключити каталоги та файли
  4. дозволяє перераховувати лише файли / каталоги
  5. дозволяє обмежити глибину пошуку
  6. він завжди спочатку сортує вихідні дані за каталогами (тому каталоги можна видалити / спорожнити в зворотному порядку)
  7. дозволяє отримати шляхи з відносними ключами
  8. важкий, оптимізований для сотень тисяч або навіть мільйонів файлів
  9. пишіть більше в коментарях :)

Приклади:

// 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'
Використовуючи наш веб-сайт, ви визнаєте, що прочитали та зрозуміли наші Політику щодо файлів cookie та Політику конфіденційності.
Licensed under cc by-sa 3.0 with attribution required.