2010-10-06 7 views
7

Ich benutze pyinotify, um einen Ordner anzusehen, wenn Dateien darin erstellt werden. Und wenn bestimmte Dateien erstellt werden, möchte ich sie verschieben. Das Problem ist, dass, sobald die Datei erstellt wird (offensichtlich), versucht mein Programm, es zu verschieben, noch bevor es vollständig auf die Festplatte geschrieben wurde.Verwenden von pyinotify, um nach der Dateierstellung zu schauen, aber darauf zu warten, dass sie vollständig auf die Festplatte geschrieben wird

Gibt es eine Möglichkeit, pyinotify warten zu lassen, bis eine Datei vollständig auf die Festplatte geschrieben wurde, bevor sie mir mitteilt, dass sie erstellt wurde? Oder gibt es einen einfachen Weg, nachdem ich benachrichtigt worden bin, python warten, um es zu verschieben, bis es fertig ist geschrieben zu werden?

Antwort

14

Haben pyinotify zu IN_CLOSE_WRITE Ereignisse reagieren:

wm.add_watch(watched_dir, pyinotify.IN_CLOSE_WRITE, proc_fun=MyProcessEvent()) 

Dies ist von man 5 incrontab, aber es gilt gleichermaßen für pyinotify:

IN_ACCESS   File was accessed (read) (*) 
    IN_ATTRIB   Metadata changed (permissions, timestamps, extended attributes, etc.) (*) 
    IN_CLOSE_WRITE  File opened for writing was closed (*) 
    IN_CLOSE_NOWRITE File not opened for writing was closed (*) 
    IN_CREATE   File/directory created in watched directory (*) 
    IN_DELETE   File/directory deleted from watched directory (*) 
    IN_DELETE_SELF   Watched file/directory was itself deleted 
    IN_MODIFY   File was modified (*) 
    IN_MOVE_SELF  Watched file/directory was itself moved 
    IN_MOVED_FROM  File moved out of watched directory (*) 
    IN_MOVED_TO   File moved into watched directory (*) 
    IN_OPEN    File was opened (*) 
+1

Beachten Sie, dass dadurch sowohl Änderungen als auch Änderungen erfasst werden (wenn Sie das gewünschte Verzeichnis spiegeln). Wenn Sie nur bei Erkennung * neuer * Dateien triggern möchten, benötigen Sie einen eigenen Handler, der 'IN_CREATE' Ereignisse verfolgt und dann auf deren Beendigung wartet (über das Ansehen der' IN_CLOSE_WRITE' Events). – TimStaley

1

Es ist ziemlich schwierig, auf dieser Ebene zu sagen, wenn eine Datei geschrieben wird. Was Sie tun können, ist zu testen, ob eine Datei von einem anderen Prozess geöffnet wird.

1) Von den verschiedenen Flags, die beim Öffnen einer Datei verwendet werden, kann das Flag O_EXLOCK hilfreich sein. Wenn das Flag O_EXLOCK gesetzt ist, verfügt der Dateideskriptor über eine exklusive Sperre für die Datei. Also mein Verständnis ist, wenn Sie os.open() mit O_EXLOCK-Flag können, ist es nicht durch andere Prozesse geöffnet. Dies sollte auf allen posix-kompatiblen OS funktionieren, aber ich habe es nicht getestet. Wenn die Datei geöffnet ist, können Sie schließen, warten und erneut versuchen.

2) Sie können auch os.stat ausprobieren und den Zeitstempel ändern und versuchen, die Informationen sicher zu interpretieren. Obwohl das nicht narrensicher ist.

3) Auf Unix-Systemen können Sie versuchen, "lsof"

4) Die folgende Seite aus der Verwendung von symbolischen Links beschreibt/proc/PID/fd für offene Dateien

[Edit: Links aktualisiert]

1

Wenn Sie die Kontrolle über den Schreibprozess haben , könnten Sie die Datei "foo.part" während des Schreibens aufrufen und sie in "foo" umbenennen, wenn sie geschlossen wurde.