PHP中rename()的奇怪行为
我的php有一个奇怪的问题。每当我尝试使用rename()移动文件时,不仅不会移动该文件,而且会删除该文件应复制到的目录以及其中的所有文件。原代码为:PHP中rename()的奇怪行为,php,windows,file,rename,Php,Windows,File,Rename,我的php有一个奇怪的问题。每当我尝试使用rename()移动文件时,不仅不会移动该文件,而且会删除该文件应复制到的目录以及其中的所有文件。原代码为: rename('temp.odt', 'tmp/report.odt'); 但我已经尝试了其他路径分隔符,如 rename('temp.odt', 'tmp\report.odt'); rename('temp.odt', 'tmp\\report.odt'); rename('temp.odt', 'tmp' . DIRECTORY_SE
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');
都没有用。代码来自第三方模块,该模块用于我正在使用的系统
检查过的要点:
编辑: 刚刚找到问题的原因。结果表明,应用程序使用的模块反过来使用了一个压缩库;此库使用与应用程序使用的名称完全相同的临时文件夹 它必须使用某种缓存,这可以解释为什么错误没有100%出现 通过将“tmp”文件夹的名称更改为其他名称,问题得以解决 感谢大家抽出时间,很抱歉用这么一件愚蠢的事情来打扰你们,事实证明,这与我最初的猜测完全无关,因此与问题的表述完全无关。上的示例确切地告诉你们要做什么-使用文件的根路径-通常可以通过使用
$\u服务器来实现['DOCUMENT\u ROOT']
(但这只会进入htdocs/public\u html目录-您需要指定其余部分)或手动键入路径(但尽量避免)
您使用反斜杠转义字符-始终使用正斜杠(我知道这是在一个单引号内,这是可以的,但如果使用双引号,您会想知道出了什么问题)!如果将文件复制到新位置,然后删除原始文件,会发生什么情况?您可以将模块的代码发布到某个位置吗?至于php.net上的注释,其他人没有这个问题。Bugtracker告诉我们,
rename
不会覆盖WinXP上的现有文件,但这与您描述的问题不一样。可能,其中有一个代码re清理“tmp”目录?是否在调用rename()时文件句柄(原始文件)尚未释放?鉴于此项目运行的机器的特点,我倾向于认为这就是问题所在。您是否尝试过使用realpath()?@SérgioDomingues-Hmm,这可能是可能的。因此我认为是可写的
在这里会有所帮助。单引号字符串中的反斜杠只能转义它们自己(\
)或者一个单引号\'
。但是更喜欢正斜杠,是的。我尝试了所有的方法。在指定的配置下,它只在“有时”起作用。@SérgioDomingues它怎么可能只在“有时”起作用?也许你需要先检查文件是否确实存在-请稍后查看我的编辑…我知道,这很奇怪。只包括一个检查,然后将文件放入当调用rename()时,契约就存在了。我现在的猜测是,在调用rename()或copy()之前,可能有其他东西正在擦除目录。现在仔细检查模块中的代码-我确信我自己的代码除了此函数调用外,不会触及该目录。
<?php
rename("/tmp/tmp_file.txt", "/home/user/login/docs/my_file.txt");
?>
<?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!";
}
?>