2017-03-27 3 views
-2

ファイルをフォルダに移動するPerlスクリプトがあります。実行するたびに、フォルダ内のファイル名がチェックされます。しかし、ファイルが大きくなると、ファイル名を確認するときに動かす準備ができていない可能性があります。私はループの最後で停止し、移動が終了する前に、それが続行されることを確認したいと思います。ファイルの移動がperlで終了したかどうかを確認するには?

+2

コードを投稿してください。 –

+0

おそらく、ファイルがループの後に新しい場所に存在するかどうかを確認することができます。 – Mohit

+0

答えがあまりにも曖昧です。あなたが必要とするものは 'flock'のような何らかのロック機構です - – Sobrique

答えて

1

3つの一般的なアプローチ。

  1. ファイルサイズを監視します。 X秒間サイズが変更されていない場合、ファイルが完成したとします。実装するのは簡単ではなく、エラーが発生しやすい
  2. の後にマーカーファイルをアップロードすると、移動したファイルが完成します。元のファイルではなくマーカーの存在を確認してください。
  3. ファイルを別の名前でコピーします。転送が完了したら名前を変更します。
+0

最初の2つを理解していますが、正しいですが、元のファイルが存在するかどうかを確認する方が簡単です。あなたは3番を説明できますか?私はそれをどのように監視できるのか分かりません。ファイルを移動し、終了後、名前を元に戻しますか? – TheAdam122

+0

はい。ファイルを 'your_file_name.in_progress'に移動します。移動が終わったら、名前を 'your_file_name'に変更してください。同じファイルシステムを使用している限り、移動はほぼ瞬時に行われることに注意してください。実際にデータを移動するのではなく、ディレクトリテーブルを更新するだけです。 –

+0

ありがとう、私は実際に移動中にファイルの名前を変更し、1つのディスクにのみファイルを移動しますが、少し時間がかかりますが、プログラムは約10,000ファイル、約3ファイル/秒で動作します。私は理想的な追跡が偽である条件を好むので、プログラムは必要な場合にだけ待機しません。 – TheAdam122

0
sleep 1 while -e $original_filename; 

は、多数のオプションおよびオプションしばらくさえ無限ありますが、あなたは、ファイルが存在することはありません場合は、永久ループでスクリプトを入れないようにするためにコードをフォーマットする必要があります。

+0

それは問題ありませんが、逆のやり方をすることをお勧めします:sleep 1 while - e $ original_filename;ファイルはコピー先のディレクトリに存在する可能性がありますが、プログラムがまだ書き込んでいる可能性があるため、元のファイル名が消えてしまった場合は、続行するのに最適な時間です。 – TheAdam122

+0

それは聞こえるほど良くはありません。本当に大きなファイルが存在しますが、部分的にしか書き込まれません。 – Sobrique

+0

@TheAdam、Yesを修正してください。私はそれを代わりに元のファイル –

関連する問題