У меня есть программа, которая должна загружать файлы из каталога, как только они написаны. Я получил FileSystemWatcher, чтобы уведомить меня об изменениях в каталоге. Вместо того, чтобы проверить событие на наличие изменений, я просто перечисляю файлы и начинаю обрабатывать все, что нашел.
Чтобы не пытаться прочитать файл, который все еще пишется, у меня есть такой код:
try {
fs = fi.Open(FileMode.Open, FileAccess.ReadWrite,
FileShare.None);
message = new byte[fs.Length];
int br = fs.Read(message, 0, (int)fi.Length);
}
catch (Exception e) {
// I'll get it next time around
return;
}
finally {
if (fs != null)
fs.Close();
}
Проблема в том, что для некоторых файлов, примерно 1 к 200, программа считывает все нули. Длина файла правильная, но содержимое кажется равным нулю байтов. Когда я проверяю последний файл, я обнаруживаю, что он действительно содержит правильные данные. Я думал, что способ открытия файла предотвратит преждевременный доступ к файлу.
Я проверяю это, копируя файлы в каталог с помощью команды DOS 'copy InFile_0 * dropdir' (около 100 файлов за выполнение.) Возможно, эта команда выполняет копирование в два этапа: 1) выделить пространство и 2) заполнить пробел и моя программа иногда прыгает в середине двух.
Любые идеи о том, как кодировать это, чтобы быть надежным?
Обновление: У меня нет контроля над программой записи - это может быть что угодно. Похоже, я должен защищаться.