2010-10-06 5 views
7

Używam pyinotify do oglądania folderu, w którym tworzone są pliki. A kiedy zostaną utworzone pewne pliki, chcę je przenieść. Problem polega na tym, że jak tylko plik zostanie utworzony (oczywiście), mój program próbuje go przenieść, nawet zanim zostanie całkowicie zapisany na dysku.Używanie pyinotify do oglądania w celu utworzenia pliku, ale czekanie, aż zostanie całkowicie zapisany na dysku.

Czy istnieje sposób, aby pyinotify czekać, aż plik zostanie całkowicie zapisany na dysku, zanim powiadomi mnie, że został utworzony? Czy jest jakiś łatwy sposób, aby po powiadomieniu, sprawić, aby pyton czekał, aby przenieść go, dopóki nie zostanie napisany?

Odpowiedz

14

Czy pyinotify reagować IN_CLOSE_WRITE wydarzeń:

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

To z man 5 incrontab, ale stosuje się równie dobrze do 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

Należy zauważyć, że spowoduje to przechwycenie modyfikacji, a także tworzenie (jeśli odzwierciedlasz katalog, który może być pożądanym zachowaniem). Jeśli chcesz wywołać tylko wykrywanie plików * new *, będziesz potrzebował niestandardowego programu obsługi, który śledzi zdarzenia "IN_CREATE", a następnie czeka na ich zakończenie (przez oglądanie zdarzeń 'IN_CLOSE_WRITE'). – TimStaley

1

Trudno powiedzieć na tym poziomie, jeśli plik jest zapisywany. Możesz zrobić to, aby sprawdzić, czy plik jest otwierany przez jakiś inny proces.

1) Z różnych flag używanych podczas otwierania pliku może być pomocna flaga O_EXLOCK. Jeśli flaga O_EXLOCK jest ustawiona, deskryptor pliku ma wyłączną blokadę pliku. Tak więc rozumiem, że jeśli możesz zrobić os.open() z flagą O_EXLOCK, nie jest ona otwierana przez inny proces. Powinno to działać na wszystkich zgodnych systemach POSIX, ale ich nie przetestowałem. Jeśli plik jest otwarty, możesz zamknąć, odczekać i ponowić próbę.

2) Możesz także spróbować os.stat i zobaczyć zmianę sygnatury czasowej i spróbować bezpiecznie interpretować informacje. Chociaż to nie jest głupi dowód.

3) W systemach UNIX, można spróbować "lsof"

4) dodaje się strona opisuje użycie dowiązania z/proc/PID/fd do testowania otwartych plików

[EDIT: Linki aktualizowany]

1

Jeśli masz kontrolę procesu pisania możesz wywołać plik "foo.part" podczas zapisywania go i zmiany nazwy na "foo" po zamknięciu.

Powiązane problemy