我有一個奇怪的問題,我的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');
都無濟於事。代碼來自我正在使用的系統中使用的第三方模塊。
點以及檢查:
- 'temp.odt' 在當前目錄中確實存在的文件;
- 目錄'tmp'確實存在,其中有幾個文件。它也不是隻讀的。
- 目標文件不存在(實際文件名有一個時間戳,我在這裏降低它爲簡單起見)
運行重命名()後,「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'文件夾的名稱更改爲其他任何內容來解決。
非常感謝大家的時間,對於這樣一個愚蠢的事情感到非常抱歉,事實證明,這與我的初步猜測完全無關,因此與所提出的問題完全無關。
如果將文件複製到新位置然後刪除原件會發生什麼? – nickb 2012-02-13 08:09:46
你可以發佈模塊的代碼嗎?至於在php.net上的評論,其他人沒有這個問題。 Bugtracker表示'rename'不會覆蓋WinXP上的現有文件,但它與您描述的並不是同一個問題。也許,有一個代碼清理'tmp'目錄? – 2012-02-13 08:10:59
當rename()被調用時,它可能是文件句柄(對於原始文件)沒有被釋放嗎?鑑於該項目正在運行的機器的特性,我傾向於認爲這是問題所在。 – 2012-02-13 08:28:45