PHP读取子目录并循环文件如何?
我需要创build一个循环遍历子目录中的所有文件。 你能帮我结构我的代码是这样的:
$main = "MainDirectory"; loop through sub-directories { loop through filels in each sub-directory { do something with each file } };
你能帮忙吗?
将RecursiveDirectoryIterator与RecursiveIteratorIterator结合使用。
$di = new RecursiveDirectoryIterator('path/to/directory'); foreach (new RecursiveIteratorIterator($di) as $filename => $file) { echo $filename . ' - ' . $file->getSize() . ' bytes <br/>'; }
如果您的子目录有子子目录,您可能需要使用recursion函数
$main = "MainDirectory"; function readDirs($main){ $dirHandle = opendir($main); while($file = readdir($dirHandle)){ if(is_dir($main . $file) && $file != '.' && $file != '..'){ readDirs($file); } else{ //do stuff } } }
没有testing代码,但这应该是接近你想要的。
我喜欢与通配符glob
:
foreach (glob("*/*.txt") as $filename) { echo "$filename\n"; }
细节和更复杂的情况。
但是,如果你有一个复杂的文件夹结构RecursiveDirectoryIterator
绝对是解决scheme。
您需要添加recursion调用的path。
function readDirs($path){ $dirHandle = opendir($path); while($item = readdir($dirHandle)) { $newPath = $path."/".$item; if(is_dir($newPath) && $item != '.' && $item != '..') { echo "Found Folder $newPath<br>"; readDirs($newPath); } else{ echo ' Found File or .-dir '.$item.'<br>'; } } } $path = "/"; echo "$path<br>"; readDirs($path);
使用子目录和子文件读取另一个解决scheme (设置正确的文件夹名称):
<?php $path = realpath('samplefolder/yorfolder'); foreach (new RecursiveIteratorIterator(new RecursiveDirectoryIterator($path)) as $filename) { echo "$filename <br/>"; } ?>
<?php ini_set('max_execution_time', 300); // increase the execution time of the file (in case the number of files or file size is more). class renameNewFile { static function copyToNewFolder() { // copies the file from one location to another. $main = 'C:\xampp\htdocs\practice\demo'; // Source folder (inside this folder subfolders and inside each subfolder files are present.) $main1 = 'C:\xampp\htdocs\practice\demomainfolder'; // Destination Folder $dirHandle = opendir($main); // Open the source folder while ($file = readdir($dirHandle)) { // Read what's there inside the source folder if (basename($file) != '.' && basename($file) != '..') { // Ignore if the folder name is '.' or '..' $folderhandle = opendir($main . '\\' . $file); // Open the Sub Folders inside the Main Folder while ($text = readdir($folderhandle)) { if (basename($text) != '.' && basename($text) != '..') { // Ignore if the folder name is '.' or '..' $filepath = $main . '\\' . $file . '\\' . $text; if (!copy($filepath, $main1 . '\\' . $text)) // Copy the files present inside the subfolders to destination folder echo "Copy failed"; else { $fh = fopen($main1 . '\\' . 'log.txt', 'a'); // Write a log file to show the details of files copied. $text1 = str_replace(' ', '_', $text); $data = $file . ',' . strtolower($text1) . "\r\n"; fwrite($fh, $data); echo $text . " is copied <br>"; } } } } } } static function renameNewFileInFolder() { //Renames the files into desired name $main1 = 'C:\xampp\htdocs\practice\demomainfolder'; $dirHandle = opendir($main1); while ($file = readdir($dirHandle)) { if (basename($file) != '.' && basename($file) != '..') { $filepath = $main1 . '\\' . $file; $text1 = strtolower($filepath); rename($filepath, $text1); $text2 = str_replace(' ', '_', $text1); if (rename($filepath, $text2)) echo $filepath . " is renamed to " . $text2 . '<br/>'; } } } } renameNewFile::copyToNewFolder(); renameNewFile::renameNewFileInFolder(); ?>