Liệt kê tất cả các tệp và thư mục trong một Thư mục với hàm đệ quy PHP


84

Tôi đang cố gắng xem qua tất cả các tệp trong một thư mục và nếu có một thư mục, hãy xem qua tất cả các tệp của nó, v.v. cho đến khi không còn thư mục nào để truy cập. Mỗi và mọi mục đã xử lý sẽ được thêm vào một mảng kết quả trong hàm bên dưới. Nó không hoạt động mặc dù tôi không chắc mình có thể làm gì / tôi đã làm gì sai, nhưng trình duyệt chạy rất chậm khi đoạn mã dưới đây được xử lý, mọi sự giúp đỡ đều được đánh giá cao, cảm ơn!

Mã:

    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 Không gọi hàm nếu bạn có .hoặc ... Hãy xem câu trả lời của tôi.
A-312

Câu trả lời:


148

Nhận tất cả các tệp và thư mục trong một thư mục, không gọi hàm khi bạn có .hoặc ...

Ma cua ban :

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

Đầu ra (ví dụ):

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)

Có thể làm cho nó để mỗi thư mục trong mảng kết quả, mảng riêng của nó có chứa tất cả các tệp con không?
user3412869

Thay thế dòng 10 bằng:getDirContents($path, $results[$path]);
A-312

1
Sử dụng scandir()có vẻ không phải là một ý tưởng hay khi hiệu suất là rất quan trọng. Các lựa chọn tốt hơn là RecursiveDirectoryIterator( php.net/manual/en/class.recursivedirectoryiterator.php )
Mugoma J. Okomba

khi thư mục trống thì hàm trên trả về tổng số 1
Ghulam Abbas

việc sử dụng realpath()sẽ cung cấp tên đích của các liên kết tượng trưng trong cùng một thư mục. Ví dụ: hãy thử ví dụ trên "/ usr / lib64" trên máy 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);

Điều này sẽ mang lại cho bạn tất cả các tệp có đường dẫn.


Không có cách nào để làm điều này mà không có đối tượng tích hợp sẵn?
user3412869

4
Hoặc bạn có thể đảo ngược tình trạng này: if (!$file->isDir()) $files[] = $file->getPathname();. Để lưu một dòng.
A-312

7
Người ta cũng có thể tránh được tiếp tục bằng cách sử dụng RecursiveDirectoryIterator :: SKIP_DOTS
Razvan Grigore

Thay đổi foreach để:$Regex = new RegexIterator($rii, '/^.+\.php$/i', RecursiveRegexIterator::GET_MATCH);
xayer

@RazvanGrigore Tôi không chắc điều này giúp ích như thế nào với các thư mục không phải .... Bạn sẽ không cần phải lọc chúng ra?
War10ck

25

Đó là phiên bản ngắn hơn:

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
Phản đối vì đây không thực sự là một cải tiến. Nó chỉ là cùng một câu trả lời được viết hơi khác một chút. Nó đi đến một câu hỏi về phong cách. Điều khoản bảo vệ (phiên bản của zkanoca) hoàn toàn ổn.
mermshaus

4
Phiên bản của Zkanoca là tốt, câu trả lời của bạn không thực sự cần thiết, một nhận xét là đủ về anh ấy. Điều này chỉ liên quan đến phong cách mã hóa.
Augwa

8

Lấy tất cả các tệp có bộ lọc (đối số thứ 2) và các thư mục trong một thư mục, không gọi hàm khi bạn có .hoặc ...

Ma cua ban :

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

Đầu ra (ví dụ):

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

Đề xuất của James Cameron.


5

Đề xuất của tôi không có cấu trúc điều khiển "foreach" xấu xí là

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

Bạn có thể chỉ muốn giải nén đường dẫn tệp, bạn có thể làm như vậy bằng cách:

array_keys($allFiles);

Vẫn là 4 dòng mã, nhưng dễ hiểu hơn là sử dụng vòng lặp hay gì đó.


1
Để tránh phải tải tất cả các file và thư mục trong bộ nhớ cùng một lúc, bạn cũng có thể sử dụng một CallbackFilterIteratormà bạn có thể lặp qua sau:$allFilesIterator = new CallbackFilterIterator($iterator, function(SplFileInfo $fileInfo) { return $fileInfo->isFile(); });
Aad Mathijssen

5

Điều này có thể hữu ích nếu bạn muốn lấy nội dung thư mục dưới dạng một mảng, bỏ qua các tệp và thư mục ẩn.

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

Kết quả sẽ như thế nào;

dir_tree(__DIR__.'/public');

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

Nguồn


3

Đây là những gì tôi nghĩ ra và đây là không có nhiều dòng mã

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

Nó xuất ra một cái gì đó giống như

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

** Các dấu chấm là các dấu chấm của danh sách không có thứ tự.

Hi vọng điêu nay co ich.


Vì bạn đã thêm câu trả lời hai năm sau khi câu hỏi được đặt ra: tại sao tôi muốn sử dụng câu trả lời của bạn thay cho câu trả lời được chấp nhận hoặc giải pháp RecursiveDirectorIterator thành ngữ?
Gordon

Tôi đã bắt đầu học PHP chỉ vài tháng trở lại đây. Tôi đã tìm kiếm giải pháp cho câu hỏi này nhưng cũng cố gắng đưa ra giải pháp của riêng mình. Tôi đã đăng nó với suy nghĩ rằng có lẽ nếu giải pháp của tôi giúp ích cho ai đó.
Koushik Das

1
Người duy nhất làm việc cho tôi trên trang web PHP dựa trên máy chủ IIS Windows 2012
Meloman

3

Đây là phiên bản sửa đổi của câu trả lời Hors, hoạt động tốt hơn một chút đối với trường hợp của tôi, vì nó loại bỏ thư mục cơ sở được truyền khi đi và có một công tắc đệ quy có thể được đặt thành false, điều này cũng rất tiện lợi. Ngoài ra, để làm cho đầu ra dễ đọc hơn, tôi đã tách tệp và tệp thư mục con, vì vậy tệp được thêm vào trước rồi mới đến tệp thư mục con (xem kết quả để biết ý tôi là gì.)

Tôi đã thử một số phương pháp và đề xuất khác xung quanh và đây là những gì tôi đã kết thúc. Tôi có một phương pháp làm việc đã thấy là rất giống nhau, nhưng dường như thất bại nơi có một thư mục con không có file nhưng thư mục con mà đã có một subsubdirectory với tác phẩm, nó không quét subsubdirectory cho các tập tin - vì vậy một số câu trả lời có thể cần phải được kiểm tra cho trường hợp đó.) ... dù sao thì tôi cũng muốn đăng phiên bản của mình ở đây để phòng trường hợp ai đó đang tìm kiếm ...

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

Tôi cho rằng một điều cần cẩn thận là không chuyển giá trị $ basedir cho hàm này khi gọi nó ... chủ yếu chỉ cần truyền $ dir (hoặc truyền một đường dẫn tệp cũng sẽ hoạt động ngay bây giờ) và tùy chọn $ đệ quy là false nếu và như cần thiết. Kết quả:

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

Thưởng thức! Được rồi, quay lại chương trình tôi đang thực sự sử dụng cái này trong ...

CẬP NHẬT Đã thêm đối số bổ sung để bao gồm các thư mục trong danh sách tệp hay không (ghi nhớ các đối số khác sẽ cần được chuyển để sử dụng điều này.) Ví dụ.

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


Cảm ơn nhưng chức năng này không liệt kê các thư mục. Chỉ tệp
Deniz Porsuk

@DenizPorsuk bán tải tốt, chắc chắn đã bỏ lỡ điều đó trong câu hỏi vào thời điểm đó. Tôi đã thêm một đối số tùy chọn để bao gồm các thư mục hay không. :-)
majick

2

Giải pháp này đã làm công việc cho tôi. RecursiveIteratorIterator liệt kê tất cả các thư mục và tệp một cách đệ quy nhưng không được sắp xếp. Chương trình lọc danh sách và sắp xếp nó.

Tôi chắc rằng có một cách để viết điều này ngắn hơn; cảm thấy tự do để cải thiện nó. Nó chỉ là một đoạn mã. Bạn có thể muốn đưa nó vào mục đích của bạn.

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

Giải pháp của @ A-312 có thể gây ra các vấn đề về bộ nhớ vì nó có thể tạo ra một mảng lớn nếu /xampp/htdocs/WORKchứa nhiều tệp và thư mục.

Nếu bạn có PHP 7 thì bạn có thể sử dụng Trình tạo và tối ưu hóa bộ nhớ của PHP như sau:

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

năng suất từ


1

Thao tác này sẽ in đường dẫn đầy đủ của tất cả các tệp trong thư mục đã cho, bạn cũng có thể chuyển các hàm gọi lại khác tới recursiveDir.

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

hoặc:realpath("$path/$file");
A-312

1

Đây là một sửa đổi nhỏ của câu trả lời majick s.
Tôi vừa thay đổi cấu trúc mảng được trả về bởi hàm.

Từ:

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

Đến:

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

Có thể giúp ích cho những người có kết quả mong đợi chính xác như tôi.


1

Đối với ai cần danh sách các tệp đầu tiên hơn là các thư mục (với bảng chữ cái cũ hơn).

Có thể sử dụng chức năng sau. Đây không phải là chức năng tự gọi. Vì vậy, bạn sẽ có danh sách thư mục, chế độ xem thư mục, danh sách tệp và danh sách thư mục dưới dạng mảng riêng biệt.

Tôi dành hai ngày cho việc này và không muốn ai đó cũng sẽ lãng phí thời gian của mình cho việc này, hy vọng sẽ giúp được ai đó.

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

sẽ xuất ra một cái gì đó như thế này.

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

                )

đầu ra 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

Thêm tùy chọn đường dẫn tương đối:

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

Đầu ra:

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

Đây là của tôi :

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

ở đây tôi có ví dụ cho điều đó

Liệt kê tất cả các tệp và thư mục trong một thư mục csv (tệp) được đọc bằng hàm đệ quy 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

Tôi đã cải thiện với một lần lặp lại kiểm tra mã tốt của Hors Sujet để tránh đưa các thư mục vào mảng kết quả:

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

    $ files = scandir ($ dir);

    foreach ($ tệp dưới dạng $ key => $ value) {
        $ path = realpath ($ dir.DIRECTORY_SEPARATOR. $ value);
        if (is_dir ($ path) == false) {
            $ results [] = $ đường dẫn;
        }
        else if ($ value! = "." && $ value! = "..") {
            getDirContents ($ path, $ results);
            if (is_dir ($ path) == false) {
                $ results [] = $ đường dẫn;
            }   
        }
    }
    trả về kết quả $;

}

0

Sẵn sàng cho chức năng sao chép và dán cho các trường hợp sử dụng phổ biến, phiên bản cải tiến / mở rộng của một câu trả lời ở trên :

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

Và nếu bạn cần đường dẫn tương đối:

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

Phiên bản này giải quyết / cải thiện:

  1. cảnh báo realpathkhi PHP open_basedirkhông bao gồm ..thư mục.
  2. không sử dụng tham chiếu cho mảng kết quả
  3. cho phép loại trừ các thư mục và tệp
  4. chỉ cho phép liệt kê các tệp / thư mục
  5. cho phép giới hạn độ sâu tìm kiếm
  6. nó luôn sắp xếp đầu ra với các thư mục trước (vì vậy các thư mục có thể được xóa / làm trống theo thứ tự ngược lại)
  7. cho phép nhận đường dẫn với các khóa tương đối
  8. tối ưu hóa nặng cho hàng trăm nghìn hoặc thậm chí hàng triệu tệp
  9. viết cho nhiều hơn trong các ý kiến ​​:)

Ví dụ:

// 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'
Khi sử dụng trang web của chúng tôi, bạn xác nhận rằng bạn đã đọc và hiểu Chính sách cookieChính sách bảo mật của chúng tôi.
Licensed under cc by-sa 3.0 with attribution required.