PHP中rename()的奇怪行为

时间:2012-02-13 07:52:34

标签: 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_SEPARATOR . 'report.odt');

rename('C:\wamp\www\zaiko\temp.odt', 'C:\wamp\www\zaiko\tmp\report.odt');

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

点好检查:

  1. “temp.odt”文件确实存在于当前目录中;
  2. 目录'tmp'确实存在,其中有几个文件。它也不是只读的。
  3. 目标文件尚不存在(实际文件名有时间戳,为简单起见,我将其缩减)
  4. 运行rename()后,'temp.odt'文件在其原始位置完好无损,而文件夹'tmp'消失以及其中的所有内容。发出以下警告:

    (!)警告:重命名(temp.odt,tmp \ report.odt)[function.rename]:系统找不到指定的路径*。 (代码:3)在第192行的C:\ wamp \ www \ zaiko \ modules \ mod_deliver.php

    *翻译自葡萄牙语

    在Windows XP上运行:带有PHP 5.3.5的Apache 2.2.17和NTFS


    编辑:

    刚刚找到问题的原因。事实证明,应用程序使用的模块又使用压缩库;此库使用一个临时文件夹,其名称与应用程序使用的名称完全相同。

    它必须使用某种缓存,这可以解释为什么错误没有100%出现。

    通过将'tmp'文件夹的名称更改为其他任何内容来解决问题。

    感谢大家的时间,抱歉打扰你这么愚蠢的事情,事实证明,这与我最初的猜测完全没有关系,因此,问题已经制定出来了。

1 个答案:

答案 0 :(得分:4)

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

你是通过使用反斜杠转义字符 - 总是使用正斜杠(我知道这是在单引号内,这没关系,但是如果你使用双引号那么你会想知道出了什么问题)!