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

我的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');
都没有用。代码来自第三方模块,该模块用于我正在使用的系统

检查过的要点:

  • 当前目录中不存在文件“temp.odt”
  • 目录“tmp”确实存在,其中有多个文件。而且它不是只读的
  • 目标文件不存在(实际文件名有一个时间戳,为了简单起见,我在这里减少了它)
  • 运行rename()后,“temp.odt”文件在其原始位置保持完整,而文件夹“tmp”及其内部的所有内容都消失了。发出以下警告:

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

    *翻译自葡萄牙语

    运行:Apache2.2.17和PHP5.3.5,在WindowsXP和NTFS上运行


    编辑:

    刚刚找到问题的原因。结果表明,应用程序使用的模块反过来使用了一个压缩库;此库使用与应用程序使用的名称完全相同的临时文件夹

    它必须使用某种缓存,这可以解释为什么错误没有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!";
    }
    ?>