2012-02-13 46 views
6

我有一個奇怪的問題,我的PHP。每當我嘗試使用rename()移動一個文件時,不僅文件不會移動,而且它應該複製到的目錄以及其中的所有文件都將被刪除。原來的代碼是:在PHP中重命名()的怪異行爲

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. 目標文件不存在(實際文件名有一個時間戳,我在這裏降低它爲簡單起見)

運行重命名()後,「temp.odt」文件是在其原有的完整位置,而文件夾'tmp'是消失以及它裏面的一切。發出以下警告:

(!)警告:重命名(temp.odt,tmp \ report.odt)[function.rename]:系統找不到指定的路徑*。 (代碼:3)在C:\ WAMP \ WWW \ zaiko \模塊\ mod_deliver.php上線192

*從葡萄牙

翻譯

運行:阿帕奇2.2.17和PHP 5.3.5在Windows XP上使用NTFS


編輯:

就發現了問題的原因。事實證明,應用程序使用的模塊依次使用壓縮庫;該庫使用與應用程序使用的名稱完全相同的臨時文件夾。

它必須使用某種緩存,這可以解釋爲什麼錯誤沒有出現100%的時間。

問題通過將'tmp'文件夾的名稱更改爲其他任何內容來解決。

非常感謝大家的時間,對於這樣一個愚蠢的事情感到非常抱歉,事實證明,這與我的初步猜測完全無關,因此與所提出的問題完全無關。

+0

如果將文件複製到新位置然後刪除原件會發生什麼? – nickb 2012-02-13 08:09:46

+0

你可以發佈模塊的代碼嗎?至於在php.net上的評論,其他人沒有這個問題。 Bugtracker表示'rename'不會覆蓋WinXP上的現有文件,但它與您描述的並不是同一個問題。也許,有一個代碼清理'tmp'目錄? – 2012-02-13 08:10:59

+0

當rename()被調用時,它可能是文件句柄(對於原始文件)沒有被釋放嗎?鑑於該項目正在運行的機器的特性,我傾向於認爲這是問題所在。 – 2012-02-13 08:28:45

回答

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

您通過使用反斜槓字符轉義 - 總是用斜槓(我知道這是一個單引號,這是確定的範圍內,但如果你用雙引號,然後你會想知道出了什麼問題)!

+0

單引號字符串中的反斜槓只能轉義自己('\\')或單引號'\''。但是,正斜線是優選的,是的。 – 2012-02-13 08:21:24

+0

我嘗試了一切。有了指定的配置,它有時只能工作。 – 2012-02-13 08:23:01

+0

@AndrewD。是的 - 好點! – MrJ 2012-02-13 08:38:23