簡體   English   中英

PHP中rename()的奇怪行為

[英]Weird behaviour of rename() in PHP

我的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. 目標文件尚不存在(實際文件名有時間戳,為簡單起見,我在這里減少了它)

在運行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'文件夾的名稱更改為其他任何內容來解決問題。

感謝你們所有的時間,並且抱歉打擾你們這樣一個愚蠢的事情,事實證明,這與我最初的猜測完全無關,因此,問題已經形成。

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

你是通過使用反斜杠轉義字符 - 總是使用正斜杠(我知道這是在單引號內,這是好的,但如果你使用雙引號,那么你會想知道出了什么問題)!

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM