移动文件并重命名

Posted

技术标签:

【中文标题】移动文件并重命名【英文标题】:Move a file and rename it 【发布时间】:2011-03-20 21:03:52 【问题描述】:

想通 php 的重命名将是我最好的选择。不过,我没有看到很多关于如何在其中使用相对 URL 的示例,所以我有点妥协了。不管怎样,这给了我权限被拒绝:

我想这样做:

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

Where ../ 当然会回到运行脚本的 1 个目录。我想不出办法……所以我这样做了:

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

但是我得到 permission denied(是的,历史文件夹归 www-data 所有,是的 data.csv 归 www-data 所有)。我觉得这很奇怪,所以我尝试了一个简单的测试:

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

我确保 www-data 可以完全控制 tempfile.txt...仍然被拒绝许可。为什么?您重命名的文件是否必须存在?你不能像linux的mv一样重命名吗?所以我只是复制()和取消链接()?

【问题讨论】:

【参考方案1】:

不仅所有权起作用,而且文件权限也起作用。确保源文件和目标目录的权限设置正确(例如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,因为他可以更改请求操作哪个文件被重命名到哪里。

【讨论】:

其实644会更好,因为CSV文件不应该是可执行的。 是的,chmod 是 644,我什至尝试了 777 让它工作。没有任何工作。和 apache 是 www-data,我知道这一点是因为我移动了其他东西并且需要它是 www-data,而且我检查了顶部。 data.csv 的完整路径是 /var/imvu/products/ht/clients/test/data.csv 其中 /var/ 归 root 所有,通过测试的 imvu 归 wwwftp 所有(我做了一个 ftp,所以我不 ftp 进入 root)。就像我说的那样,它的去向(历史)目录归 www-data 所有。 会不会是文件在使用中?可以重命名为管理员吗? 可能是这样,但是我制作的测试文件 tempfile.txt 只是我在 root 中创建的(从未被任何东西打开),然后我在其中 chmod 到 777 然后 chown 到 www -data...仍然不会重命名。【参考方案2】:

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

在您的示例中,您显然缺乏对“../”的写入权限。顺便说一下,被移动文件的权限是不相关的。

【讨论】:

以上是关于移动文件并重命名的主要内容,如果未能解决你的问题,请参考以下文章

java 把文件从一个目录,移动到另一目录并重命名。

从一个文件夹重写文件并重命名它们[重复]

Linux下使用mv重命名文件或者移动文件

文件和文件夹的移动复制删除重命名

Linux下对文件夹和文件重命名、移动和删除

CSS 移动并重命名“特色图片”框