简体   繁体   English

PHP 读取子目录并循环遍历文件如何?

[英]PHP read sub-directories and loop through files how to?

I need to create a loop through all files in subdirectories.我需要通过子目录中的所有文件创建一个循环。 Can you please help me struct my code like this:你能帮我这样构造我的代码吗:

$main = "MainDirectory";
loop through sub-directories {
    loop through filels in each sub-directory {
        do something with each file
    }
};

Use RecursiveDirectoryIterator in conjunction with RecursiveIteratorIterator. RecursiveDirectoryIterator与RecursiveIteratorIterator结合使用。

$di = new RecursiveDirectoryIterator('path/to/directory');
foreach (new RecursiveIteratorIterator($di) as $filename => $file) {
    echo $filename . ' - ' . $file->getSize() . ' bytes <br/>';
}

You probably want to use a recursive function for this, in case your sub directories have sub-sub directories 如果你的子目录有子目录,你可能想要使用递归函数

$main = "MainDirectory";

function readDirs($main){
  $dirHandle = opendir($main);
  while($file = readdir($dirHandle)){
    if(is_dir($main . $file) && $file != '.' && $file != '..'){
       readDirs($file);
    }
    else{
      //do stuff
    }
  } 
}

didn't test the code, but this should be close to what you want. 没有测试代码,但这应该接近你想要的。

You need to add the path to your recursive call. 您需要添加递归调用的路径。

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 '&nbsp;&nbsp;Found File or .-dir '.$item.'<br>';
    }
  }
}

$path =  "/";
echo "$path<br>";

readDirs($path);

I like glob with it's wildcards : 我喜欢带有通配符的glob

foreach (glob("*/*.txt") as $filename) {
    echo "$filename\n";
}

Details and more complex scenarios. 细节和更复杂的场景。

But if You have a complex folders structure RecursiveDirectoryIterator is definitively the solution. 但是,如果你有一个复杂的文件夹结构, RecursiveDirectoryIterator绝对是解决方案。

Come on, first try it yourself! 来吧,先试试吧!

What you'll need: 你需要什么:

scandir()
is_dir()

and of course foreach 当然还有foreach

http://php.net/manual/en/function.is-dir.php http://php.net/manual/en/function.is-dir.php

http://php.net/manual/en/function.scandir.php http://php.net/manual/en/function.scandir.php

Another solution to read with sub-directories and sub-files (set correct foldername): 使用子目录和子文件读取的另一个解决方案 (设置正确的foldername):

<?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();
?>
$allFiles = [];
public function dirIterator($dirName)
{
    $whatsInsideDir = scandir($dirName);
    foreach ($whatsInsideDir as $fileOrDir) {
        if (is_dir($fileOrDir)) {
            dirIterator($fileOrDir);
        }
        $allFiles.push($fileOrDir);
    }

    return $allFiles;
}

Minor modification on what John Marty posted, if we can safely eliminate any items that are named . 如果我们可以安全地删除任何已命名的项目,对John Marty发布的内容进行微小修改。 or .. 要么 ..

function readDirs($path){
  $dirHandle = opendir($path);
  while($item = readdir($dirHandle)) {
    $newPath = $path."/".$item;
    if (($item == '.') || ($item == '..')) {
        continue;
    }
    if (is_dir($newPath)) {
        pretty_echo('Found Folder '.$newPath);
        readDirs($newPath);
    } else {
        pretty_echo('Found File: '.$item);
    }
  }
}

function pretty_echo($text = '')
{
    echo $text;
    if (PHP_OS == 'Linux') {
        echo "\r\n";
    }
    else {
        echo "</br>";
    }
}

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM