2011-12-19 92 views
0

我有一個PHP腳本,用於將文件移出服務器上的特定文件夾(IBM AS400)。我遇到的問題是,有時腳本在文件仍在移動到文件夾的過程中運行。讓PHP等到一個文件完成傳輸後再傳輸

我的錯誤邏輯假設如果一個文件「正在使用」PHP不會嘗試移動它,但它會導致文件損壞。

我想我能做到這一點:

$oldModifyTime = filemtime('thefile.pdf'); 
sleep(2); 
if($oldModifyTime === filemtime('thefile.pdf'){ 
    rename('thefile.pdf','/folder2/thefile.pdf'); 
} 

但filemtime功能拿出即使文件被寫入相同的值。我也嘗試過使用fileatime獲得相同的結果。

如果我在Windows中執行右鍵單擊 - >屬性,則修改日期和訪問日期會隨着文件的寫入而不斷變化。

任何想法如何確定文件是否完成傳輸之前做任何事情呢?

回答

1

從PHP手冊條目filemtime()

注:這個函數的結果會被緩存。有關更多詳細信息,請參見clearstatcache()


我也將表明2秒是有點短,以檢測文件傳輸是否完成由於網絡擁塞,緩衝等

1

將其作爲臨時名稱或傳輸到其他文件夾,然後在傳輸完成後將其重命名/複製到正確的文件夾。

+0

初始文件是從終端用戶保存文件來進入文件夾,所以我不能自動「重命名/複製到正確的文件夾」,而無需在服務器端執行並遇到同樣的問題。 – Mike 2011-12-19 18:20:54

+0

這真的是最好的解決方案。如果是手動過程,則可能需要教育用戶並調整腳本。例如,您可以忽略以.tmp結尾的所有文件,並指示您的用戶使用.tmp上傳,然後在上傳後重命名。 – 2011-12-19 18:28:39

+0

如果即使這是不可能的,那麼看看這個問題:http://stackoverflow.com/q/4693168/608781 – 2011-12-19 18:29:00