C#: Контроль скопированных или перемещенных файлов с FileSystemWatcher

Я столкнулся с несколькими "решениями" здесь и через сеть, но ни один, кажется, не отвечает всем требованиям.

То, что я надеюсь делать, имеют приложение, контролируют папку для новых файлов (или созданием, перемещением или копией) и выполняют действия с теми объектами. Так как тот был сценарий, я обратился к классу FileSystemWatcher для выполнения этого действия.

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

Там какой-либо путь состоит в том, чтобы иметь этот огонь события в конце создания файла в противоположность началу? Я попробовал различную комбинацию FileSystemWatcher. Свойство NofityFilter без успеха.

Заранее спасибо! :)

8
задан nokturnal 9 August 2010 в 00:11
поделиться

4 ответа

Я использовал пару решений для этой ситуации.

  1. Если вы можете работать с создателем файла и использовать схему переименования файла. EG. Создайте файл как __Name_ во время создания, а в конце процесса переименуйте его в Name и событие сработает, и у вас будет полный файл.

  2. Когда сработает ваш триггер, проверьте, можете ли вы получить эксклюзивную блокировку только для чтения на файл. Если вы можете, значит, операция записи в файл завершена. (Я писал кое-что об этом в другом вопросе Keep settings in sync between forms application and windows service (or any n-tier, really))

Вы могли бы интегрировать что-то вроде #2 в ваше Changed Event и тогда вы получите результат.

6
ответ дан 5 December 2019 в 20:12
поделиться

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

Более подробная информация из того, что я прочитал здесь: http://social.msdn.microsoft.com/forums/en-US/vblanguage/thread/f84bb7c8-b7d5-44da-b0f3-6d1a70415d11/

1
ответ дан 5 December 2019 в 20:12
поделиться

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

0
ответ дан 5 December 2019 в 20:12
поделиться

Я знаю, что то, что я вам скажу, не выглядит элегантным. Мне также приходилось отслеживать файлы, которые приходили из разных мест, некоторые из них были большими, а некоторые - маленькими. Мы выяснили, что FileSystemWatcher не подходит для этой цели. Если вы хотите быть уверены на 100%, вы можете время от времени проверять, используя класс Timer и его событие Elapsed.

1
ответ дан 5 December 2019 в 20:12
поделиться
Другие вопросы по тегам:

Похожие вопросы: