php递归获取目录内文件(包含子目录)封装类分享


下面是一个使用PHP编写的简单类,用于递归地获取指定目录内的所有文件和子目录。这个类将提供一个方法来遍历目录并收集所有文件和子目录的路径。


<?php

class DirectoryIterator {
    private $directory;

    public function __construct($directory) {
        if (!is_dir($directory)) {
            throw new InvalidArgumentException("$directory is not a directory.");
        }
        $this->directory = $directory;
    }

    /**
     * 递归获取目录下的所有文件和子目录
     *
     * @return array 包含所有文件和子目录路径的数组
     */
    public function getAllFilesAndFolders() {
        $items = [];

        // 打开目录
        $dir = opendir($this->directory);

        // 读取目录中的每个项目
        while (($file = readdir($dir)) !== false) {
            // 排除'.'和'..'
            if ($file != "." && $file != "..") {
                $path = $this->directory . DIRECTORY_SEPARATOR . $file;

                // 如果是目录,则递归处理
                if (is_dir($path)) {
                    $items = array_merge($items, $this->getDirectoryItems($path));
                } else {
                    // 如果是文件,直接添加到数组中
                    $items[] = $path;
                }
            }
        }

        // 关闭目录
        closedir($dir);

        return $items;
    }

    /**
     * 递归处理目录
     *
     * @param string $path 目录路径
     * @return array 包含目录内所有文件和子目录路径的数组
     */
    private function getDirectoryItems($path) {
        $items = [];

        $dir = opendir($path);

        while (($file = readdir($dir)) !== false) {
            if ($file != "." && $file != "..") {
                $fullPath = $path . DIRECTORY_SEPARATOR . $file;

                if (is_dir($fullPath)) {
                    $items = array_merge($items, $this->getDirectoryItems($fullPath));
                } else {
                    $items[] = $fullPath;
                }
            }
        }

        closedir($dir);

        return $items;
    }
}

// 使用示例
$dirIterator = new DirectoryIterator("/path/to/your/directory");
$filesAndFolders = $dirIterator->getAllFilesAndFolders();
print_r($filesAndFolders);

?>

这个类包含两个主要方法:`__construct` 用于初始化目录路径,`getAllFilesAndFolders` 用于递归获取所有文件和子目录的路径。`getDirectoryItems` 是一个私有方法,用于递归地处理目录中的每个项目。

请注意,你需要将 `"/path/to/your/directory"` 替换为你想要遍历的目录的实际路径。此外,这个类没有处理潜在的错误,如目录权限问题或文件系统错误,这些在生产环境中可能需要额外处理。