2010-06-26 61 views
4

可以說我有一個PHP腳本將服務於一個大文件,我目前正在通過FTP上傳這個大文件。PHP:如何檢查一個文件當前是否正在寫入

如果上傳完成,我可以檢查我的PHP腳本嗎?有沒有例如一種方式,我可以檢查一個文件目前正在寫入或類似的東西?

更新:應該提到過這個,但我不是說通過上傳腳本上傳我正在談論上傳大的PDF文件或通過其他方式如FTP或SFTP等。

+0

如果文件在上傳過程中被鎖定,試圖['flock'](http://de2.php.net/manual/en/function.flock.php)它從PHP返回'FALSE',然後你知道該文件被別的atm使用。 – Gordon 2010-06-26 11:51:58

+0

@戈登:如果腳本是平行運行兩次,那意味着即使一個人成功了,另一個人也會失敗?要麼? – Svish 2010-06-27 10:23:58

+0

如果上傳當前正在運行並且FTP對文件有鎖定,則兩個腳本都會返回false。如果沒有上傳,並且一個腳本會聚集文件,那麼是的,另一個會返回false。 – Gordon 2010-06-27 10:50:29

回答

2

你可以在上傳腳本中使用一個有價值的文件(在temportantly目錄中),如果上傳完成,你可以簡單地將文件移動到你的最終位置,文件名稱很好。

這是該問題的常見解決方案。

對於獲得temportantly文件(環境無關)使用PHP函數:

resource tmpfile (void) 

Documemtation它你可以在http://pl.php.net/manual/en/function.tmpfile.php 這個函數返回找到手柄到新的乾淨的臨時文件。

但是,如果您使用此功能,則必須在關閉句柄之前複製文件,因爲當您撥打fclose(handle)時刪除了該文件。爲了得到文件緩衝區的保證是乾淨的,你可以在結束時致電fflush(handle)


或者如果你不想使用tmpfile(void)函數,你可以做這個manualy。

string tempnam (string $dir, string $prefix) 

前綴是文件的前綴,用於輕鬆地將她分組以刪除或其他內容。調用此函數獲得輸入目錄中唯一的文件,如目錄讓你臨時目錄在你的環境,你可以通過調用得到這樣的:

string sys_get_temp_dir (void) 

然後,當你有自我臨時文件,寫入上傳數據和關閉。 複製使用此文件到您的最終位置:

bool copy (string $source, string $dest [, resource $context ]) 

和刪除您的臨時文件在您的通話環境弄乾淨:

bool unlink (string $filename [, resource $context ]) 
0

你不說你正在運行在其上的操作系統,但如果您使用的是類Unix系統,則可以使用fuser來查看誰正在使用文件。有相當於Windows端的handle

相關問題