如何递归地运行到一个文件夹及其子目录,同时在每个目录中添加一个带有当前目录内容列表的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) 等...
答案 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";
}
}
这可能看起来有点吓人,但实际上相对简单:
RecursiveDirectoryIterator
将执行大部分工作,但是如果您对其进行迭代,您将获得所选目录的节点,就像您通过一个简单的DirectoryIterator
获得的那样。
但是,由于它实现了RecursiveIterator
接口,你可以通过RecursiveIteratorIterator
来驱动它并在你的循环中保存自己的“有孩子?递归到...”条件,这是RecursiveIteratorIterator
将为您做什么并返回一个看起来平坦的迭代器,但实际上它会递归到子节点中。您可以使用getDepth
来检测何时启动带叶节点的子迭代,并且可以使用完整路径名来检测目录的更改方式。