настроить файловую систему так, чтобы она создавала созданное событие только тогда, когда файл полностью скопирован - PullRequest
2 голосов
/ 05 января 2012

Когда в просматриваемой папке перемещается большой файл, он вызывает событие created даже до полного копирования файла.

Копирование таких файлов в созданном событии приводит к ошибке «файл используется другим процессом».

Я использовал поток, который пытается скопировать файл, пока ему это не разрешено. Но я все еще не удовлетворен.

Можно ли настроить FileSystemWatcher таким образом, чтобы созданное событие вызывалось только после полного копирования файла? Спасибо.

Ответы [ 2 ]

5 голосов
/ 05 января 2012

В документации для класса FileSystemWatcher конкретно указано ваше наблюдаемое поведение

Обычные операции файловой системы могут вызывать более одного события. Например, когда файл перемещается из одного каталога в другой, могут возникнуть несколько событий OnChanged и некоторые события OnCreated и OnDeleted. Перемещение файла - это сложная операция, которая состоит из нескольких простых операций, поэтому вызывает несколько событий. Аналогично, некоторые приложения (например, антивирусное программное обеспечение) могут вызывать дополнительные события файловой системы, которые обнаруживаются FileSystemWatcher.

Вы можете проверить, снята ли блокировка с файла, а затем узнать, что копирование завершено?

1 голос
/ 05 января 2012

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

Подробности о том, как создавать свои собственные события здесь: http://msdn.microsoft.com/en-us/library/5z57dxz2.aspx

Поскольку FileSystemWatcher, как обсуждалосьby plenderj утверждает, что события могут быть запущены, вы не можете его использовать.Это действительно хорошо только при первом создании, то есть при первом запуске копирования, а затем при изменении будет вызываться, возможно, много раз.

РЕДАКТИРОВАТЬ: Существует VB (только) класс, который упаковывает копию Windows.Вы можете использовать это в c #, так как все работает вне clr.Это обеспечит диалоговое окно Windows для отображения хода копирования.

http://msdn.microsoft.com/en-us/library/microsoft.visualbasic.fileio.filesystem.copyfile.aspx

Спасибо,

Брэд

...