我的php出现了一个奇怪的问题。每当我尝试用rename()移动文件时,不仅文件没有被移动,而且应该复制到的目录以及其中的所有文件都会被删除。原始代码是:
rename('temp.odt', 'tmp/report.odt');
但我已经尝试过其他路径分隔符,比如
rename('temp.odt', 'tmpreport.odt');
rename('temp.odt', 'tmp\report.odt');
rename('temp.odt', 'tmp' . DIRECTORY_SEPARATOR . 'report.odt');
rename('C:wampwwwzaikotemp.odt', 'C:wampwwwzaikotmpreport.odt');
一切都无济于事。代码来自第三方模块,该模块用于我正在开发的系统。
检查良好的点:
- 当前目录中不存在文件"temp.odt"
- 目录"tmp"确实存在,其中有几个文件。而且它不是只读的
- 目标文件不存在(实际文件名有一个时间戳,为了简单起见,我在这里减少了它)
运行rename()后,"temp.odt"文件在其原始位置完好无损,而文件夹"tmp"及其内部的所有内容都已消失。将发出以下警告:
(!)警告:rename(temp.odt,tmp\report.odt)[function.rename]:系统找不到指定的路径*。(代码:3)在C:\wamp\www\zaiko\modules\mod_deliver.php中192行
*翻译自葡萄牙语
运行:Apache 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!";
}
?>
你使用反斜杠来转义字符-总是使用正斜杠(我知道这是在一个单引号内,这是可以的,但如果你使用双引号,你会想知道出了什么问题)!