为什么PHP重命名($ file)仍在删除文件?

时间:2018-12-17 21:50:34

标签: php directory rename delete-file

所以我正在使用php重命名功能来系统地重命名特定文件夹中的所有文件。

根据输出缓冲区,它可以正常工作。 当我查看文件夹时,它缺少文件11-99。我在下面用自己的函数替换了重命名函数,但是得到的结果完全相同。

代码:

function rename_files($directory){
  $path = 'C:\xampp\htdocs\email' . '\\' . $directory . '\\';

  $x = 00001;

 foreach (glob($path."*") as $filename) {
     $newFile = $path . 'list' . $x . '.txt';
     $content = file_get_contents($filename); //this function returns the content of a file.
     echo "$newFile and old $filename<br>";
     unlink($filename);

     $file = fopen($newFile, "w");
     fwrite($file,$content);
     fclose($file);
     ++$x;
  }
}

输出: PHP Output Buffer

现实:

Actual Files Created In The Folder

2 个答案:

答案 0 :(得分:3)

您的主要问题是,源目录和目标目录相同,并且旧文件和新文件的名称重叠。

查看输出的前两行应该会向您显示问题。新创建的文件list1.txt在第二次循环迭代中被删除。

一个简单但可行的解决方案是在您移动并重命名所有文件的地方创建一个新目录(rename应该适用于此目录),然后删除现在空的源目录,并将其替换为临时的。

答案 1 :(得分:0)

您的某些新文件名与旧文件名相同。

您将list103 (2).txt重命名为list11.txt。这样就覆盖了原始的list11.txt。后来,您将list11.txt重命名为list25.txt

结果,原始list11.txt丢失了。

这种情况反复发生:list1 (2).txt -> list1.txt -> list2.txt

您需要检查$newFile是否已经存在,并使用不存在的其他名称。或对旧文件和新文件使用不同的命名约定,以使它们不会彼此冲突。