代码之家  ›  专栏  ›  技术社区  ›  ParoX

移动文件并重命名

  •  5
  • ParoX  · 技术社区  · 15 年前

    我认为PHP的重命名是我的最佳选择。不过,我没有看到很多关于如何在其中使用相对URL的例子,所以我有点妥协了。不管怎样,这给了我拒绝的许可:

    我想这样做:

    $file = "../data.csv";
    rename("$file", "../history/newname.csv");
    

    在哪里? 当然,将返回运行脚本的1个目录。我想不出办法……所以我改为这样做:

    $file = "data.csv";
    $path = dirname(realpath("../".$file));
    rename("$path/$file", "$path/history/newname.csv");
    

    但是我得到了 权限被拒绝 (是的,历史文件夹归WWW数据所有,而yes data.csv归WWW数据所有)。我觉得很奇怪,所以我尝试了一个简单的测试:

    rename( 'tempfile.txt', 'tempfile2.txt' );
    

    我确保WWW数据对tempfile.txt有完全控制权…仍然被拒绝。为什么?您要重命名的文件必须存在吗?你不能像Linux的mv那样重命名吗?所以我只需要copy()和unlink()?

    2 回复  |  直到 12 年前
        1
  •  5
  •   Marc Donges    15 年前

    为了将文件从“../”移动到“../history/”,进程需要对“../”和“../history/”同时具有写权限。

    在您的示例中,您明显缺少对“..”的写权限。顺便说一下,要移动的文件的权限不相关。

        2
  •  2
  •   Paul Lammertsma    15 年前

    所有权不仅起作用,而且还起到文件权限的作用。确保在源文件和目标目录(例如 chmod 644 data.csv )

    www-data 与Apache相同的用户?

    编辑: 注意提供 现有绝对路径 realpath() . 还要注意以下事项:

    $path = dirname(realpath("../".$file));
    

    这可能不会产生任何结果,因为文件 ../data.csv 可能不存在。即 RealPATH() 在不存在的文件上 false .

    下面是一些代码,可能对您更好:

    $file = "data.csv";
    $path1 = realpath($file);
    $path2 = realpath(dirname($file).'/..').'/history/newname.csv';
    rename($path1, $path2);
    

    你应该非常小心 $file 访问者无法编辑,因为他可以更改请求,操作将哪个文件重命名为where。