假设我的服务器上有2个目录:
/xyz/public_html/a/
/xyz/public_html/b/
它们都包含许多文件。如何根据name
和file_extension
检测这两个文件夹共有的文件。该程序将在PHP中实现。有什么建议吗?
答案 0 :(得分:3)
使用FileSystemIterator
,你可能会做这样的事情......
<?
$it = new FilesystemIterator('/xyz/public_html/a/');
$commonFiles = array();
foreach ($it as $file) {
if ($file->isDot() || $file->isDir()) continue;
if (file_exists('/xyz/public_html/b/' . $file->getFilename())) {
$commonFiles[] = $file->getFilename();
}
}
基本上,您必须遍历一个目录中的所有文件,并查看另一个目录中是否存在任何具有相同名称的文件。请记住,文件名包含扩展名。
答案 1 :(得分:2)
如果它只是两个目录,你可以使用类似于merge sort的合并算法的算法,其中你有两个已经排序的项目列表,并在比较当前项目的同时走它们:
$iter1 = new FilesystemIterator('/xyz/public_html/a/');
$iter2 = new FilesystemIterator('/xyz/public_html/b/');
while ($iter1->valid() && $iter2->valid()) {
$diff = strcmp($iter1->current()->getFilename(), $iter2->current()->getFilename());
if ($diff === 0) {
// duplicate found
} else if ($diff < 0) {
$iter1->next();
} else {
$iter2->next();
}
}
另一种解决方案是使用数组键的唯一性,以便将每个目录项作为键放入数组中,然后检查其他目录中的每个项是否存在这样的键:
$arr = array();
$iter1 = new FilesystemIterator('/xyz/public_html/a/');
foreach ($iter1 as $item) {
$arr[$item->getFilename()] = true;
}
$iter2 = new FilesystemIterator('/xyz/public_html/a/');
foreach ($iter2 as $item) {
if (array_key_exists($item->getFilename(), $arr)) {
// duplicate found
}
}
答案 2 :(得分:0)
如果你只是想找出哪些是共同的,你可以轻松地使用scandir两次并找到共同点,例如:
//Remove first two elements, which will be the constant . and .. Not a very sexy solution
$filesInA = array_shift(array_shift(scandir('/xyz/publichtml/a/')));
$filesInB = array_shift(array_shift(scandir('/xyz/publichtml/b/')));
$filesInCommon = array_intersect($filesInA, $filesInB);