PHP中rename()的怪异行为



我的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');

一切都无济于事。代码来自第三方模块,该模块用于我正在开发的系统。

检查良好的点:

  1. 当前目录中不存在文件"temp.odt"
  2. 目录"tmp"确实存在,其中有几个文件。而且它不是只读的
  3. 目标文件不存在(实际文件名有一个时间戳,为了简单起见,我在这里减少了它)

运行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!";
}
?>

你使用反斜杠来转义字符-总是使用正斜杠(我知道这是在一个单引号内,这是可以的,但如果你使用双引号,你会想知道出了什么问题)!

相关内容

  • 没有找到相关文章

最新更新