如何在各种目录中检测具有相同名称的文件?

时间:2011-05-29 07:53:17

标签: php

假设我的服务器上有2个目录:

/xyz/public_html/a/
/xyz/public_html/b/

它们都包含许多文件。如何根据namefile_extension检测这两个文件夹共有的文件。该程序将在PHP中实现。有什么建议吗?

3 个答案:

答案 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);