2011-09-29 15 views
6

私はピックアップディレクトリをチェックし、見つかったファイルを処理してから削除するPythonスクリプトを持っています。ピックアップディレクトリ:まだ書き込まれているファイルを取り込む方法はありますか?

そのディレクトリにファイルをドロップするプロセスによってまだ書き込まれているファイルをピックアップしないようにするにはどうすればよいですか?

私のテストケースはかなりシンプルです。私は300MBのファイルをピックアップディレクトリにコピー&ペーストし、スクリプトはまだ書かれているファイルをつかむことがよくあります。部分的なファイルだけを処理してから削除します。これは、書き込まれていたファイルが消えてしまったため、OSのファイル操作エラーを引き起こします。

  • 私は/プロセスをオープンする前に/それを削除(FileLockモジュールを使用して)、ファイルのロックを取得しようとしました。しかし、それは助けにはなりません。

  • ファイルの変更時刻を調べて、今からX秒以内に何かを避けることを検討しました。しかし、それはclunkyと思われる。

私のテストはOSXで行われていますが、私は主要なプラットフォームで動作するソリューションを探しています。

ここでも同様の質問が表示されますが、明確な解決策はありませんでした(How to check if a file is still being written?)。

は、この問題に対する

+1

ファイルを書き込んでいるアプリケーションは、本当にそれを原子的に行うべきですが、私はあなたがこれを制御できないかもしれないことに気付きます。 –

+0

私はファイルを原子的に書く必要があるか、OSを介して直接的または間接的に書き込みを行うプロセスと通信する必要があるかのどちらかを確実に行うと思います。ファイルロックや変更イベントなどのOS固有のソリューションがありますが、AFAIKはクロスプラットフォームではありません。変更時間を確認することは、おそらくクロスプラットフォームのソリューションを取得するのと同じくらい効果的です。 –

答えて

2

回避策として、ファイルが変更されたイベントを聞くことができます(watchdogはクロスプラットフォームです)。修正されたイベント(少なくともOS X上)は、書き込みごとに起動されず、終了時にのみ起動されます。したがって、変更されたイベントを検出すると、すべての書き込みが完了したとみなすことができます。

もちろん、ファイルがチャンクで書き込まれていて、各チャンクの後に保存されている場合、これは機能しません。

1

一つの解決策は、最初の一時ファイルにファイルを書き込み、それが行われたときに先にその一時ファイルを移動するファイルの書き込みプログラムを変更することになり、ありがとうございました。ほとんどのオペレーティングシステムでは、ソースとデスティネーションが同じファイルシステム上にある場合、移動は不可分です。

+0

残念ながら、残念ながら私はシステムのその部分を制御できません:( – Jagu

1

書き込み部分を制御できない場合は、ファイルを自分で見ることができます。一定の時間成長が止まったら、それを良い状態にしてください。私は自分でその方法を使用しなければならず、40秒は私の条件では安全だと分かった。

0

対処する前にファイルを開こうとしましたか?ファイルがまだ使用中の場合、open()は例外をスローする必要があります。

try: 
    with open(filename, "rb") as fp: 
    pass 
    # Copy the file 
except IOError: 
    # Dont copy 
+0

これはすべてのOSで動作しません.LinuxとOSXではファイルがロックされている必要はありませんまた、Windowsでは、他のプロセスがファイルに書き込んでいないことを確認するために、読み取りロックの代わりに書き込みロックを取得したいと思うかもしれません( 'rb'ではなく 'wb'を使用してください)。 –

1

ファイルロックメカニズムは移植性がないため、各OSには異なる解決方法があります。

  • Windowsでは、OSロックを使用できます。
  • Linuxでは開いているファイルを見ることができます(lsofと同じように)。ファイルが開いている場合はそのままにしておきます。
関連する問題