2

ディレクトリをスキャンして新しいファイルがいつ追加されるかを確認し、その内容を処理するスクリプトがあります。それらはビデオファイルであるため、多くの場合非常に大きく、ネットワークを介して転送され、転送に長い時間がかかることがよくあります。したがって、先に進む前に、コピーが完了していることを確認する必要があります。

現時点では、ディレクトリで新しいファイルを見つけたら、os.path.mtimeを使用して変更日を確認し、それをファイルが最後にスキャンされたときと比較して、まだ変更されているかどうかを確認します。 。理論は、それがもはや変更されていない場合、それは転送を終了する必要があるということです。

if getmtime(path.join(self.rootFolder, thefile)) < self.lastchecktime: newfiles.append[thefile]

しかし、それは機能していないようです。スクリプトのトリガーが早すぎて、ファイルが完全にロードされていないために処理が失敗します。スキャンの間に十分な休止がなく、mtimeが同じままである可​​能性がありますか?スキャンの間隔は10秒です。確かにそれで十分です。

これを行う簡単でよりPython的な方法はありますか?ファイルは、VM上で実行されているWindowsサーバー上にあります。

4

2 に答える 2

1

ファイルの追加を制御できますか? videoname-completeその場合は、ビデオのアップロードが完了したときのような名前の空のファイルを作成し、それらのファイルを監視できます。

于 2012-12-21T01:19:44.137 に答える
1

あなたのチェックは「私の変更された時間は最後にチェックされた時間よりも大きいですか?」ではありませんか?

if os.path.getmtime(path) > self.lastAccessedTime: 
    # do something as modified time is greater than last time I checked
    pass 

私は Windows の専門家ではありませんが、Windows 用の inotify に相当するライブラリがいくつかあると確信しています。これは、ファイル システム レベルでファイルまたはディレクトリの変更をリッスンするための非常に優れた方法です。Linux で pyinotify を使用して動作するサンプル コードをいくつか残しておきます。

class PTmp(pyinotify.ProcessEvent):
    def process_IN_CLOSE_WRITE(self, event):
        print "Changed: %s " % os.path.join(event.path, event.name)


wm = pyinotify.WatchManager()
mask = pyinotify.IN_CLOSE_WRITE
notifier = pyinotify.Notifier(wm, PTmp())
wdd = wm.add_watch(FILE_LOCATION, mask, rec=True)

while True:
    try:
        notifier.process_events()
        if notifier.check_events():
            notifier.read_events()

    except KeyboardInterrupt:
        notifier.stop()
        break
于 2012-12-21T01:22:00.270 に答える