2011-01-14 6 views
5

ファイルをコピーして処理するためにローカルディレクトリを開くPHPスクリプトがあります。しかし、これらのファイルは、遅いFTPプロセスによってアップロードされているため、不完全である可能性があります。まだ完全にアップロードされていないファイルはコピーまたは処理したくありません。ファイルがアップロードされているか開いている場合にPHPで検出する

ファイルがまだコピーされている(読み込まれている)のか、書き込まれているのかを知ることは可能ですか?

完全にアップロードされたファイルのみを処理するスクリプトが必要です。今

FTPプロセス、並行してファイルをアップロードし、それが変更する各ファイルサイズのために1秒以上を取るので、このトリックは、今私のために働いていない、他の方法が

答えて

4

ことを示唆しているスクリプトコントロールを持っていますかFTPプロセスを介して?その場合は、アップロードを行っているスクリプトにプライマリアップロードが完了した後に[FILENAME] .completeファイル(空白のテキストファイル)をアップロードしてください。処理スクリプトはそこに一致する* .completeファイルがあるとファイルが完全であることを認識します。

+0

これは問題です、私はアップロードスクリプトのコントロールを持っていません。私はいつでもファイルを見つけることができるフォルダが1つしかないので、ファイルがあるかどうかを検出する必要があります完了したか否か – albanx

3

彼の素晴らしい提案のために@MidnightLightningに+1してください。プロセスを制御できない場合は、いくつかのオプションがあります:

ファイルの最終サイズを知っていれば、現在のサイズと既知のサイズを比較するのにfilesize()を使用してください。一致するまでチェックしてください。

最終的なサイズを知る必要がある場合は、少しトリッキーになります。 filesize()を使用してファイルのサイズを確認し、2〜2秒待ってからもう一度チェックしてください。サイズが変更されていない場合、アップロードは完了する必要があります。 2番目の方法の問題は、ファイルのアップロードが何らかの理由でストールする場合です。したがって、待つ時間が重要です。

+0

+1;あなたがファイルを管理していなければ、私もこれを提案するつもりでした。 – MidnightLightning

+0

私はこれらの解決方法を試してみましたが、時には動作しますが、ftpプロセスではファイルを並行してアップロードします。ファイルサイズが変更されるのに1秒以上かかるので、示唆している? – albanx

+0

@albanx - その場合のあなたの唯一の選択肢は、待ち時間を増やすことだと思います。または、アップロードが停止したと判断する前に何度か確認してください。 – Cfreak

2

OSの種類は指定しませんが、Unixタイプのボックスの場合は、fuserおよび/またはlsofが必要です。 fuserは誰が特定のファイルを使用しているかを報告し、lsofは開いているすべてのファイル(ソケット、fifos、.soなど)を一覧表示します。いずれの場合も、あなたのディレクトリを監視するために使用される可能性があります。

Windows側には、同じことをするSysinternalsの無料ツールがいくつかあります。 handleこのトリックを行う可能性があります

+0

申し訳ありませんが、残念ながら私はWindowsサーバー2008年 – albanx

関連する問題