-6

如何递归地运行到一个文件夹及其子目录,同时在每个目录中添加一个带有当前目录内容列表的 xml 文件?

我试过这样的东西:

$dir = new DirectoryIterator($folder);
foreach ($dir as $fileinfo) {
    $fd=fopen('index.xml','wb');
    if (!$fileinfo->isDot() && !is_dir($fileinfo)) {
        fwrite($fd,'Something');
    }
}

编辑 :

脚本应该这样做:

打开 dir 然后在此处使用此处存在的文件列表(不是 dirs)在此处创建 xml 文件然后打开下一个目录,然后在此处使用此处存在的文件列表(不是 dirs)在此处创建 xml 文件等...

4

1 回答 1

1

如果您想要目录结构的平面迭代,请尝试组合由RecursiveIteratorIterator驱动的RecursiveDirectoryIterator。这就是迭代骨架的样子:

$start_dir =  '/some/path';
$rit = new RecursiveIteratorIterator(
    new RecursiveDirectoryIterator(
        $start_dir,
        FilesystemIterator::KEY_AS_PATHNAME |
        FilesystemIterator::CURRENT_AS_FILEINFO |
        FilesystemIterator::SKIP_DOTS
    ),
    RecursiveIteratorIterator::SELF_FIRST
);

foreach ($rit as $path => $fileinfo) {
    $level = $rit->getDepth();
    if ($fileinfo->isDir()) {
        print "[{$level}] in dir:{$path}\n";
    } else {
        print "[{$level}] file: {$path}\n";
    }
}

这可能看起来有点吓人,但实际上相对简单:

  1. RecursiveDirectoryIterator完成大部分工作,但是如果您对其进行迭代,您将获得所选目录的节点,就像您通过 aa simple 获得的一样DirectoryIterator

  2. 但是,由于它实现了RecursiveIterator接口,因此您可以通过 a 驱动它RecursiveIteratorIterator并在循环中为自己保存“有孩子?递归到...”条件,这就是RecursiveIteratorIterator将为您做的事情并返回一个看起来平坦的迭代器,但是它实际上递归到子节点。您可以使用getDepth来检测带有叶节点的子迭代何时开始,并且您可以使用完整路径名来检测目录的变化方式。

于 2013-06-27T07:36:23.940 回答