C #: мониторинг скопированных или перемещенных файлов с помощью FileSystemWatcher - PullRequest
8 голосов
/ 09 августа 2010

Я сталкивался с несколькими «решениями» здесь и в Интернете, но ни одно из них, похоже, не отвечает всем требованиям.

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

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

Есть ли способ вызвать это событие при завершении создания файла, а не в начале?Я пробовал различные комбинации свойства FileSystemWatcher.NofityFilter, но безуспешно.

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

Ответы [ 4 ]

6 голосов
/ 09 августа 2010

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

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

  2. Когда ваш триггер срабатывает, проверьте, можете ли вы получить эксклюзивную блокировку только для чтения на файл.Если вы можете, операция записи в файл была завершена.(Я написал кое-что об этом в другом вопросе Синхронизируйте настройки между приложением форм и службой Windows (или любым n-уровневым, действительно) )

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

1 голос
/ 09 августа 2010

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

1 голос
/ 09 августа 2010

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

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

0 голосов
/ 09 августа 2010

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

...