php重命名表现得很奇怪?

时间:2010-10-03 22:21:15

标签: php filesystems

我有这个脚本,我将发布绝对未经修改:

<?
chdir("data");
$files = glob("*");
shuffle($files);
var_dump($files);
$i=0;
$finfo = finfo_open(FILEINFO_MIME_TYPE); // return mime type ala mimetype extension
foreach($files as $file) {
  $i++;
  $k = $i;
  $mime = finfo_file($finfo, $file);
  if(strpos($mime,"gif") !== false) {
    $ext = "gif";
  } else {
    $ext = "jpg";
  }
  if($k < 10) {
    $k = "00".$k;
  } else if($k < 100) {
    $k = "0".$k;
  }
  $k = $k.".".$ext;
  rename($file,$k);
  echo $k."\n";
}

文件夹数据中包含一些图像文件(jpg和gif)。 但是当我运行它时,很多图像突然消失了! 2/3的图像刚被删除... 我不明白怎么样? 我有一个ext3文件系统和PHP 5.3.2

2 个答案:

答案 0 :(得分:1)

我无法在代码中看到任何肯定会导致此行为的内容。我能想到的最可能的原因可能是rename($file,$k);正在覆盖已经存在的文件。您可以添加以下内容来排除这种情况:

if(file_exists($k.".".$ext)) {
    $k .= ".0" ;
}
while(file_exists($k.".".$ext)) {
    $k .= "0" ;
}
$k = $k.".".$ext;
rename($file,$k);

另一个想法是,chdir("data")可能会出现问题,您可以通过在$ file和$ k之前插入完整路径来检查重命名。我不认为这很可能。

答案 1 :(得分:1)

你有两次跑吗?

第一次运行它时,它会将所有图像重命名为0001.jpg - 00nn.jpg。第二次它开始覆盖东西,因为源名称和目标名称会重叠,例如它将0042.jpg重命名为0001.jpg,因此现有的0001.jpg消失了。

在将$ file重命名为$ k之前检查$ k是否存在会很好:

if(!is_file($k)) {
    rename($file, $k);
}