PHP 재귀 함수가 있는 디렉터리의 모든 파일 및 폴더 나열
디렉토리내의 모든 파일을 조사하려고 하고 있습니다.디렉토리가 있는 경우는, 그 모든 파일을 조사해 주세요.디렉토리가 없어질 때까지 계속 조사합니다.각 처리 항목은 아래 함수의 결과 배열에 추가됩니다.무엇을 할 수 있는지, 무엇을 잘못했는지 모르겠지만, 아래의 코드가 처리되면 브라우저의 동작이 매우 느려집니다.감사합니다.
코드:
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'));
를 가져옵니다. 이 기능이 는, 기능을 하지 말아 ..
★★★★★★★★★★★★★★★★★」..
.
고객님의 코드:
<?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)
$rii = new RecursiveIteratorIterator(new RecursiveDirectoryIterator('path/to/folder'));
$files = array();
foreach ($rii as $file) {
if ($file->isDir()){
continue;
}
$files[] = $file->getPathname();
}
var_dump($files);
이렇게 하면 경로가 있는 모든 파일이 나타납니다.
RecursiveIteratorIterator가 있는 디렉토리에 있는 모든 파일과 폴더를 가져오는 기능입니다.
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));
숨겨진 파일 및 디렉토리를 무시하고 디렉토리 내용을 배열로 가져오려는 경우 도움이 됩니다.
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',
]
filter(2nd 인수)와 폴더를 포함한 모든 파일을 디렉토리에서 가져옵니다.이 경우 함수를 호출하지 않습니다..
★★★★★★★★★★★★★★★★★」..
.
고객님의 코드:
<?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"
}
제임스 카메론의 제안이요
추악한 "전진" 제어 구조가 없는 내 제안은
$iterator = new RecursiveIteratorIterator(new RecursiveDirectoryIterator($path));
$allFiles = array_filter(iterator_to_array($iterator), fn($file) $file->isFile());
파일 경로만 추출할 수 있습니다.해동할 수 있는 방법은 다음과 같습니다.
array_keys($allFiles);
여전히 4줄의 코드지만, 루프 같은 걸 사용하는 것보다 더 직설적이죠.
여기 제가 생각해낸 것이 있습니다. 그리고 이것은 코드 행이 많지 않습니다.
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
** 이 점들은 정렬되지 않은 목록의 점들입니다.
이게 도움이 됐으면 좋겠다.
상대 경로 추가 옵션:
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
)
여기 Hors answer의 수정 버전이 있습니다.이 버전은 진행하면서 전달되는 기본 디렉토리를 삭제하고 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 값을 전달하지 않도록 주의해야 할 점이 하나 있습니다.대부분의 경우 $190을 전달하기만 하면 됩니다(또는 파일 경로를 전달해도 됩니다).옵션으로 $190은 필요에 따라 false로 처리됩니다.그 결과:
[0] => demo-image.png
[1] => filelist.php
[2] => tile.png
[3] => 2015\header.png
[4] => 2015\08\background.jpg
즐기세요! 좋아요, 제가 실제로 사용하고 있는 프로그램으로 돌아가서...
UPDATE 파일목록에 디렉토리를 포함하거나 포함하지 않도록 인수를 추가했습니다(다른 인수를 기억하려면 이 인수를 사용해야 합니다).
$results = get_filelist_as_array($dir, true, '', true);
이 솔루션은 나에게 효과가 있었다.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>';
?>
그러면 지정된 디렉토리 내의 모든 파일의 전체 경로가 인쇄됩니다.또, 다른 콜백 함수를 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');
이것은 majicks의 답변을 약간 수정한 것입니다.
함수에서 반환된 배열 구조를 방금 변경했습니다.
송신원:
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;
}
나처럼 똑같은 결과를 예상하는 사람들에게 도움이 될 수 있을 거야
목록 파일이 폴더보다 먼저 필요한 사용자(알파벳 이전 버전)
다음 기능을 사용할 수 있습니다.이것은 셀프 호출 기능이 아닙니다.디렉토리 리스트, 디렉토리 뷰, 파일 리스트, 폴더 리스트도 개별 어레이로서 사용할 수 있습니다.
나는 이것을 위해 이틀을 보내고 누군가 이것 때문에 그의 시간을 낭비하는 것을 원하지 않는다. 희망은 누군가를 돕는다.
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
)
@은 @A-312의 경우 대규모 수 있으므로 할 수 이는 대규모 어레이를 생성할 수 있기 때문입니다./xampp/htdocs/WORK
에는 많은 파일과 폴더가 포함되어 있습니다.
만약 당신이 PHP 7을 가지고 있다면, 당신은 Generators를 사용하여 다음과 같이 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";
}
일반적인 사용 사례에 대한 복사 및 붙여넣기 기능을 사용할 수 있습니다. 상기 답변의 개량/확장 버전:
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);
}
이 버전은 다음과 같은 문제를 해결/개선합니다.
- 에 대해 설명합니다.
realpath
PHP의open_basedir
에는 되지 않습니다...
디렉토리로 이동합니다. - 결과 배열에 참조를 사용하지 않음
- 디렉토리 및 파일을 제외할 수 있습니다.
- 파일/디렉토리만 나열할 수 있습니다.
- 검색 깊이를 제한할 수 있습니다.
- 항상 먼저 디렉토리로 출력을 정렬합니다(디렉토리를 역순으로 삭제/삭제할 수 있습니다).
- 상대 키를 사용하여 경로를 가져올 수 있습니다.
- 수십만 또는 심지어 수백만 개의 파일에 최적화된 중량
- 코멘트에 기입해 주세요:)
예:
// 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'
여기 제 것이 있습니다.
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 ;
}
여기에 그것에 대한 예가 있다.
PHP 재귀 함수로 읽은 디렉토리 csv(파일)의 모든 파일 및 폴더 나열
<?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);
}
}
?>
결과 배열에 폴더가 포함되지 않도록 Hors Sujet의 양호한 코드를 한 번 체크하여 개선했습니다.
함수 getDirContents($dir, &$dir = array()){ $files = scandirfiles); $key = > $value로 foreach foreach{$path = realpath displays.Directory_SEPARATOR.$value); if(is_syslogpath) == false) {$path[] = $path; }else if specvalue != ". & $value != ".." {getDirContents($path, $results); if(is_syslogpath) == false) {$path[] = $path; }}}$140를 반환한다. }
Laravel을 사용하는 경우,getAllFiles
의 메서드Storage
모든 파일을 재귀적으로 가져오려면 다음 문서를 참조하십시오.
use Illuminate\Support\Facades\Storage;
class TestClass {
public function test() {
// Gets all the files in the 'storage/app' directory.
$files = Storage::getAllFiles(storage_path('app'))
}
}
이 간단한 코드를 찾았습니다.https://stackoverflow.com/a/24981012
$Directory = new RecursiveDirectoryIterator($path);
$Iterator = new RecursiveIteratorIterator($Directory);
//Filter to get only PDF, JPEG, JPG, GIF, TIF files.
$Regex = new RegexIterator($Iterator, '/^.+(.jpe?g|.gif|.png|.tif|.pdf)$/i', RecursiveRegexIterator::GET_MATCH);
foreach($Regex as $val => $Regex){
echo "$val\n<br>";
}
언급URL : https://stackoverflow.com/questions/24783862/list-all-the-files-and-folders-in-a-directory-with-php-recursive-function
'programing' 카테고리의 다른 글
"new" 연산자를 사용하여 개체를 만들 때 괄호를 생략할 수 있습니까? (0) | 2022.10.02 |
---|---|
JavaScript에서 var가 문자열인지 확인하려면 어떻게 해야 합니까? (0) | 2022.10.02 |
인덱싱이 'C'에서 0으로 시작하는 이유는 무엇입니까? (0) | 2022.10.02 |
오류: 오류 1005: 테이블을 만들 수 없습니다(errno: 121) (0) | 2022.10.02 |
VueJ에서 "개발 모드" 주의 사용 안 함s (0) | 2022.10.02 |