FileSystemWatcher.WaitForChanged возвращает, но все равно блокировка файла - PullRequest
0 голосов
/ 18 февраля 2009

У меня есть программа, которая отправляет документ в драйвер принтера PDF, и этот драйвер печатает в определенный каталог. После печати я хочу прикрепить PDF к электронному письму (MailMessage) и отправить его.

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

  • Я считал простой Thread.Sleep (2000) или что-то еще, но это далеко не идеально.
  • Я подумал о том, чтобы поместить код вложения в блок try / catch и зациклить при неудаче, но опять же, это просто плохие новости.

Я не могу придумать элегантного решения.

Ответы [ 4 ]

3 голосов
/ 18 февраля 2009

WaitForChanges ожидает создания события , как вы его закодировали. Когда документ создается, вы получаете уведомление: это не означает, что файл полностью записан, а блокировка снята.

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

Я только что проверил наш дамп PDF в код каталога, и мы используем только WaitForChanges, чтобы обнаружить начало нового файла. Затем мы используем try {} catch {}, где catch (не получая прав на файл) повторно отправляет попытку в очередь, которую мы обслуживаем: каждая попытка «откатывается» дольше, поэтому первая попытка составляет 1 секунду после того, как мы обнаружили файл, второй - через 2 секунды, затем 4, 8 и т. д. Это уменьшает число повторных попыток для больших файлов, в то же время оставаясь достаточно отзывчивым на более короткие файлы.

2 голосов
/ 18 февраля 2009

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

Кроме этого, я не уверен, что вы можете сделать, потому что у наблюдателя нет события AFAIK "закрытие файла".

0 голосов
/ 18 февраля 2009

Если вы используете для этого Adobe Acrobat, вы можете сгенерировать PDF-файл с помощью Acrodist.exe (у меня на макушке, вам нужен ключ / N), а затем дождаться завершения порожденного процесса

0 голосов
/ 18 февраля 2009

AFAIK нет способа проверить блокировки файлов без обработки ошибок.

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

...