2010-05-24 4 views
3

для больших файлов или медленных подключений, копирование файлов может занять некоторое время., который инициализирует событие, сигнализирует о завершении большой операции с файлом?

using pyinotify, я смотрел код события IN_CREATE. но это, похоже, происходит на старте передачи файла. Мне нужно знать, когда файл полностью скопирован - он очень полезен, если его только половина.

при передаче файла завершено и завершено, какое событие inotify уволено?

ответ

12

IN_CLOSEвозможно означает, что запись завершена. Это не так, потому что некоторые приложения являются плохими актерами и постоянно открывают и закрывают файлы во время работы с ними, но если вы знаете приложение, с которым имеете дело (передача файлов и т. Д.), И понимаете его поведение, вы вероятно, хорошо. (Обратите внимание, это не означает, что передача завершена успешно, очевидно, это просто означает, что процесс, который открыл дескриптор файла, закрыл его).

IN_CLOSE ловит оба IN_CLOSE_WRITE и IN_CLOSE_NOWRITE, поэтому принимайте собственные решения о том, хотите ли вы просто поймать один из них. (Вероятно, вы захотите, чтобы оба они были - WRITE/NOWRITE связаны с разрешениями на файлы, а не были ли сделаны какие-либо записи).

Существует больше документации (хотя досадно, не это кусок информации) в Documentation/filesystems/inotify.txt.

+0

мой вопрос относится конкретно к копированию файлов в наутилус. в этом случае достаточно IN_CLOSE_WRITE. IN_CLOSE сам по себе не существует в pyinotify. –

0

Почему вы не добавляете фиктивный файл в конце передачи? Вы можете использовать код события IN_CLOSE или IN_CREATE на манекене. Важно то, что манекен, который будет передан в качестве последнего файла в последовательности.

Надеюсь, это поможет.

1

Для моего случая я хотел выполнить сценарий после того, как файл был полностью загружен. Я использовал WinSCP, который пишет большие файлы с расширением .filepart до завершения.

Сначала я начал модифицировать свой сценарий, чтобы игнорировать файлы, если они сами заканчиваются на .filepart, или если есть другой файл, существующий в том же каталоге с тем же именем, но расширение .filepart, следовательно, это означает, что загрузка не полностью завершена все же.

Но потом я заметил, что в конце загрузки, когда все части были закончены, у меня есть уведомление об активации IN_MOVED_IN, которое помогло мне запустить мой сценарий именно тогда, когда я этого захотел.

Если вы хотите знать, как ваш файл загрузчик ведет себя, добавьте к этому incrontab:

/your/directory/ IN_ALL_EVENTS echo "$$ [email protected] $# $% $&" 

, а затем

tail -F /var/log/cron 

и контролировать все события, получать вызвали, чтобы выяснить, какие из них подходит Ты лучший.

Удачи вам!