【问题标题】:Why is PHP rename($file) still deleting files?为什么 PHP rename($file) 仍在删除文件?
【发布时间】:2019-05-18 07:22:31
【问题描述】:

所以我使用 php rename 函数来系统地重命名特定文件夹中的所有文件。

根据输出缓冲区,它工作正常。 当我查看文件夹时,它缺少文件 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 重命名函数”,但你不是,你使用的是结构不佳的 diy 方法,而不是 php.net/manual/en/function.rename.php
  • 你为什么要给 $x 赋值 1 后缀四个零?
  • 我感觉您正在覆盖现有文件,您能否尝试追加所有内容并查看是否是这种情况?
  • 我开始使用 rename() 并得到完全相同的结果。因此,在阅读了 php 手册后,我尝试了这种“结构不佳的 diy 方法”。 php.net 手册也给了我同样的结果。我以为我也在重写文件,所以我将所有新文件都更改为附加一个“a”以避免这种情况。它仍然缺少随机文件。
  • Philipp 有一点,您正在生成新文件并将其提供给重命名(再次)...

标签: php directory rename delete-file


【解决方案1】:

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

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

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

【讨论】:

    【解决方案2】:

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

    您将list103 (2).txt 重命名为list11.txt。这覆盖了原来的list11.txt。后来你把list11.txt改名为list25.txt

    因此,原来的list11.txt 丢失了。

    这种情况一遍又一遍地发生:list1 (2).txt -&gt; list1.txt -&gt; list2.txt

    您需要检查$newFile 是否已存在,并使用不存在的其他名称。或者也许对新旧文件使用不同的命名约定,这样它们就不会相互冲突。

    【讨论】:

      猜你喜欢
      • 2018-02-13
      • 2015-06-24
      • 2023-03-05
      • 2011-08-19
      • 2020-05-08
      • 2010-12-14
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多