PHP比较两个文件夹以查找缺失文件

5
我有两个图像文件夹original/和thumbs/,但是文件数量不同(thumbs/较少),因此我需要找到缺失的图像,文件名完全相同,即thumbs上没有前缀。那么如何比较两个文件夹并输出缺失图像的列表?
更新:
没有一个答案能够满足我的要求,但我想出了这个非常粗糙的答案。
不建议使用!!
我们给body设置一个深色背景,然后用明显的颜色来风格化img:
<style>
    body{background:#000;}
    img {height:10px;width:10px;background:pink;border:1px solid #ccc;padding:10px;margin:5px;}
</style>

PHP:

// Read dir ...
        $images = glob('original/{*.jpg,*.gif,*.png}', GLOB_BRACE);

// throw out a foreach ...
        foreach($images as $image) 
         {

// using str_replace switch folders 
          $image  = str_replace('original/', 'thumbs/', $image);

// echo result 
          $result = '<img src="' . $image . '" alt="m" />';
          echo $result;
}

经过漫长的等待和几乎毁坏系统,所有的图片现在都显示出来了,你只需查看每个图片并找到缺失的那些。
结果请参见: http://s12.postimage.org/5kcsvs48r/missing.jpg 就像我之前说的,这是一种非常粗糙的方法,对服务器要求很高,如果只有几张图片可能还好,但是当你需要处理超过8000张图片时,你会发现阅读来寻找缺失的图片是不可行的。总之,我认为这种方法并不可取,但我还是想分享我的答案,无论好坏。

你尝试过使用 opendir() 函数来获取目录中的文件列表吗? - Waygood
或者说,你到目前为止尝试了什么? - Jon Egeland
http://php.net/manual/en/function.readdir.php - Madara's Ghost
5个回答

6
一种开始的方法:
$original = array_map('basename', glob('original/*.{jpg,gif,png}', GLOB_BRACE));
$thumbs = array_map('basename', glob('thumbs/*.{jpg,gif,png}', GLOB_BRACE));
$missing_thumbs = array_diff($original, $thumbs);
$missing_original = array_diff($thumbs, $original);

编辑说明:我错过了array_diff()在这里无法使用的事实,因为glob()数组包含路径名...现在用basename()映射修补了,现在可以按预期工作了。


1

php.net上有很多关于如何浏览目录的文档和讨论(请参见:scandir(), readdir(), glob()等)。

示例1

此示例读取一个扁平目录(没有子目录),并将它们进行比较,最终结果保存在数组中。

$original = glob('path/to/original/*.*');
$thumbs   = glob('path/to/thumbs/*.*');

$missing = array('original' => array(), 'thumbs' => array());

$missing['original']   = array_diff($thumbs, $original);
$missing['thumbs'] = array_diff($original, $thumbs);

print_r($missing); // Prints out a sorted array of the missing files for each dir

这个例子的问题在于,如果您在任何一个文件夹中有子文件夹,那么就需要使用下面这样的递归结构来处理。

示例 2

此示例利用递归查找 thumbs/original/ 目录下 所有 子目录中的所有缺失文件。

/* Returns an associative array of all files under a directory,
including those inside of sub-directories, using recursion */
function scan($path) {
  $dir = opendir($path);
  
  while(false !== ($f = readdir($handle)))
    if(is_dir($f))
        $files[$f] = scan($path.$f.'/');
      else
        $files[$f] = $f;
    
    return $files;
  }

$original = scan('path/to/original/');
$thumbs = scan('path/to/thumbs/');

$missing['thumbs'] = array_diff($original, $thumbs);
$missing['original'] = array_diff($thumbs, $original);

print_r($missing);
print_r($original);
print_r($thumbs);

0
以下内容摘自www.php.net/opendir/
// Open a known directory, and proceed to read its contents
if (is_dir($dir)) {
    if ($dh = opendir($dir)) {
        while (($file = readdir($dh)) !== false) {
            echo "filename: $file : filetype: " . filetype($dir . $file) . "\n";
        }
        closedir($dh);
    }
}

你可以针对你的两个目录执行此操作,并将文件名放入单独的数组中,而不是直接输出它们。然后比较这些数组以查找缺失的文件。


0
$originalsDir = 'path';
$originalsArray = array();
if ($handle = opendir($originalsDir)) {
    while (false !== ($entry = readdir($handle))) {
        if ($entry == '.' || $entry == '..') {
            continue;
        }
        $originalsArray[] = $entry;
    }
    closedir($handle);
} else {
    die('Could not open originals dir: ' . $originalsDir);
}
$thumbsDir = 'path';
$thumbsArray = array();
if ($handle = opendir($thumbsDir)) {
    while (false !== ($entry = readdir($handle))) {
        if ($entry == '.' || $entry == '..') {
            continue;
        }
        $thumbsArray[] = $entry;
    }
    closedir($handle);
} else {
    die('Could not open thumbs dir: ' . $thumbsDir);
}

$missingThumbs = array_diff($originalsArray, $thumbsArray);

请参见array_diff(), opendir(), readdir()


0
$dir_files1 = array();
$dir_files2 = array();

//Do this twice, Once for each directory
if ($handle = opendir('/path/to/files1')) {
    echo "Directory handle: $handle\n";
    echo "Entries:\n";

    /* This is the correct way to loop over the directory. */
    while (false !== ($entry = readdir($handle))) {
        $dir_files1[] = $entry;
    }
}

//Then compare the two arrays with eachother
foreach($dir_files1 as $d1)
{
 $match =false;
 foreach($dir_files2 as $d2)
 {
    if($d1==$d2)
     $match=true;
 }
 if(!$match)
   do_something();
}

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接