2016-01-05 4 views
0

Мне нужно посмотреть каталог файлов изображений (jpeg, png, tif, gif, bmp) и обработать новые файлы, размещенные там. Я пытаюсь реализовать это используя FileSystemWatcherПросмотрите каталог и обработанные файлы. Проверьте, завершено ли копирование и открытые дескрипторы.

private void watch() 
{ 
    FileSystemWatcher watcher = new FileSystemWatcher(); 
    watcher.Path = path; 
    watcher.Filter = "*.*"; 
    watcher.Changed += new FileSystemEventHandler(OnChanged); 
    watcher.EnableRaisingEvents = true; 
} 

Но как я могу убедиться, что файл копируется в полном объеме и нет ручки блокировки файла, прежде чем пытаться открыть его?

ответ

1

Чтобы обработать файл один раз его полностью скопировали вам нужно добавить ниже фильтр:

watcher.NotifyFilter = NotifyFilters.LastWrite; 

Это сообщит, как только файл будет полностью скопирован в каталог

Ref: FileSystemWatcher

Для фильтра с несколькими файлами у вас есть два варианта:

watcher.Filter = "*.*"; 

или используйте следующий конструктор:

FileSystemWatcher watcher = new FileSystemWatcher("path","*.*"); 
+0

Спасибо .. но как я могу добавить несколько фильтров файлов – techno

+0

ссылается на редактирование для этого – Kayani

+0

Это не может обрабатывать частичные копии файлов, если процесс копирования завершился с ошибкой при копировании файла, например, при удалении FTP-соединения в середине отправки файл. –

0

Единственный процесс, который знает, является ли или не файл полностью скопирован один делает копирование. Подумайте об этом - файл представляет собой просто поток данных. Без дополнительной информации нет способа узнать, сколько данных должно быть в файле.

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

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

Возможно, процесс отправки отправит файл «DONE» - после отправки DataFile процесс отправки затем отправит файл нулевой длины с именем DataFile.done. Как только вы увидите DataFile.done, вы точно знаете, что DataFile был полностью скопирован. Если вы не видите DataFile.done, DataFile не полностью скопирован.

Вы также можете отправить процесс переименования файла - если ваша базовая ОС и файловая система поддерживают операции переименования атома. Сначала вы можете отправить свой процесс отправки DataFile.copying, а после завершения копирования переименуйте файл в DataFile. Любой файл, который имеет расширение .copying, все еще находится в процессе копирования.

В некоторых форматах файлов данных также указываются полные файлы. Файлы PDF следуют указанному формату, и вы можете узнать, завершены ли они. Файлы XML могут быть сконструированы таким образом, чтобы вы могли узнать, завершены ли они. Но это не эффективное решение, так как требует анализа содержимого файла, и если файлы большие или есть требования к производительности, непрерывное чтение каждого файла несколько раз может привести к серьезным проблемам с производительностью ввода-вывода.

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

Системы, которые полагаются на угадывание и надежду, как правило, не очень надежны.

+0

. Спасибо. Я просто пытаюсь контролировать обычную операцию копирования с помощью проводника Windows. Если Файловая система Watcher не может обнаружить новое создание файла, то в чем смысл этого события -FileSystemWatcher.Created? – techno

+0

@techno Проблема не в том, что она обнаруживает это - проблема в том, что она не может определить, когда копия файла выходит из строя посередине. Если это не проблема, она может работать нормально для вас. –

+0

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