在PHP中重命名()的怪异行为
我有一个奇怪的问题,我的PHP。每当我尝试使用rename()移动一个文件时,不仅文件不会移动,而且它应该复制到的目录以及其中的所有文件都将被删除。原来的代码是:在PHP中重命名()的怪异行为
rename('temp.odt', 'tmp/report.odt');
,但我已经尝试过其他的路径分隔符像
rename('temp.odt', 'tmp\report.odt');
rename('temp.odt', 'tmp\\report.odt');
rename('temp.odt', 'tmp' . DIRECTORY_SEPARATOR . 'report.odt');
rename('C:\wamp\www\zaiko\temp.odt', 'C:\wamp\www\zaiko\tmp\report.odt');
都无济于事。代码来自我正在使用的系统中使用的第三方模块。
点以及检查:
- 'temp.odt' 在当前目录中确实存在的文件;
- 目录'tmp'确实存在,其中有几个文件。它也不是只读的。
- 目标文件不存在(实际文件名有一个时间戳,我在这里降低它为简单起见)
运行重命名()后,“temp.odt”文件是在其原有的完整位置,而文件夹'tmp'是消失以及它里面的一切。发出以下警告:
(!)警告:重命名(temp.odt,tmp \ report.odt)[function.rename]:系统找不到指定的路径*。 (代码:3)在C:\ WAMP \ WWW \ zaiko \模块\ mod_deliver.php上线192
*从葡萄牙
翻译运行:阿帕奇2.2.17和PHP 5.3.5在Windows XP上使用NTFS
编辑:
就发现了问题的原因。事实证明,应用程序使用的模块依次使用压缩库;该库使用与应用程序使用的名称完全相同的临时文件夹。
它必须使用某种缓存,这可以解释为什么错误没有出现100%的时间。
问题通过将'tmp'文件夹的名称更改为其他任何内容来解决。
非常感谢大家的时间,对于这样一个愚蠢的事情感到非常抱歉,事实证明,这与我的初步猜测完全无关,因此与所提出的问题完全无关。
PHP.net上的例子告诉你该怎么做 - 使用ROOT PATH到文件 - 通常这可以通过使用$_SERVER['DOCUMENT_ROOT']
来获得(但是这只能到达htdocs/public_html目录 - 您需要指定其余部分)或通过手动输入路径(但尝试避免这种情况)。
<?php
rename("/tmp/tmp_file.txt", "/home/user/login/docs/my_file.txt");
?>
在猜测,下面应该工作(假设这是你的路径) - 这也将检查你的文件确实存在,因此它可以被重新命名 - 你需要确保tmp/
摆在首位实际存在,但你会得到一个错误弹出,如果它没有:
<?php
$root = getcwd().DIRECTORY_SEPARATOR; // Obtain the current working dir
$srcpath = $root."temp.odt"; // The file you want to rename
$destpath = $root."tmp/report.odt"; // Where you want to rename the file to
// make sure file exists and its movable
if(is_writable($srcpath)){
// if it exists, rename it
rename($srcpath, $dstpath);
echo "File was renamed!";
} else {
echo "It seems that the specified file doesn't exist!";
}
?>
您通过使用反斜杠字符转义 - 总是用斜杠(我知道这是一个单引号,这是确定的范围内,但如果你用双引号,然后你会想知道出了什么问题)!
单引号字符串中的反斜杠只能转义自己('\\')或单引号'\''。但是,正斜线是优选的,是的。 – 2012-02-13 08:21:24
我尝试了一切。有了指定的配置,它有时只能工作。 – 2012-02-13 08:23:01
@AndrewD。是的 - 好点! – MrJ 2012-02-13 08:38:23
如果将文件复制到新位置然后删除原件会发生什么? – nickb 2012-02-13 08:09:46
你可以发布模块的代码吗?至于在php.net上的评论,其他人没有这个问题。 Bugtracker表示'rename'不会覆盖WinXP上的现有文件,但它与您描述的并不是同一个问题。也许,有一个代码清理'tmp'目录? – 2012-02-13 08:10:59
当rename()被调用时,它可能是文件句柄(对于原始文件)没有被释放吗?鉴于该项目正在运行的机器的特性,我倾向于认为这是问题所在。 – 2012-02-13 08:28:45