Использование pyinotify для наблюдения за созданием файла, но ожидание его полной записи на диск - PullRequest
7 голосов
/ 06 октября 2010

Я использую pyinotify для просмотра папки, когда файлы создаются в ней.И когда определенные файлы созданы, я хочу переместить их.Проблема в том, что, как только файл создается (очевидно), моя программа пытается переместить его, даже до того, как он будет полностью записан на диск.

Есть ли способ заставить pyinotify ждать, пока файл не будет полностью записанна диск, прежде чем уведомить меня, что он был создан?Или есть какой-нибудь простой способ, после того как я получу уведомление, заставит python подождать, пока он не будет записан?

Ответы [ 3 ]

15 голосов
/ 07 октября 2010

Пусть pyinotify реагирует на IN_CLOSE_WRITE события:

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

Это от man 5 incrontab, но оно одинаково хорошо применимо и к пиинофикации:

   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 голос
/ 07 октября 2010

Если у вас есть контроль над процессом записи, вы можете вызвать файл «foo.part» во время его записи и переименовать его в «foo» после его закрытия.

1 голос
/ 07 октября 2010

На этом уровне довольно сложно определить, выполняется ли запись в файл.Что вы можете сделать, так это проверить, открывается ли файл каким-либо другим процессом.

1) Из различных флагов, которые используются при открытии файла, может помочь флаг O_EXLOCK.Если установлен флаг O_EXLOCK, дескриптор файла имеет эксклюзивную блокировку файла.Поэтому я понимаю, что если вы можете сделать os.open () с флагом O_EXLOCK, он не будет открыт другим процессом.Это должно работать на всех posix-совместимых ОС, но я не проверял это.Если файл открыт, вы можете закрыть, подождать и повторить попытку.

2) Вы также можете попробовать os.stat и увидеть изменение метки времени и попытаться безопасно интерпретировать информацию.Хотя это не дурак.

3) В системах Unix вы можете попробовать "lsof"

4) На следующей странице описано использование символических ссылок из / proc / PID / fd для проверки открытых файлов

[Редактировать: Ссылки обновлены]

...