循环dirs并在php中写入xml的内容文件

时间:2013-06-26 20:36:17

标签: php xml

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

我尝试过类似的东西:

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

修改:

脚本应该这样做:

打开dir然后在这里创建xml文件,其中包含此处存在的文件列表(不是dirs) 然后打开下一个目录,然后在这里创建xml文件,其中包含此处存在的文件列表(不是dirs) 等...

1 个答案:

答案 0 :(得分:1)

如果您想要对目录结构进行平面迭代,请尝试合并由RecursiveDirectoryIterator驱动的RecursiveIteratorIterator。这就是迭代的骨架看起来像:

$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将执行大部分工作,但是如果您对其进行迭代,您将获得所选目录的节点,就像您通过一个简单的DirectoryIterator获得的那样。

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