Проверьте, завершено ли сканирование файла TIFF - PullRequest
1 голос
/ 16 ноября 2011

У меня есть FileSystemWatcher, отслеживающий каталог, который получает файлы TIF от сканирующего устройства.

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

У меня есть что-то вроде:

private void OnFileCreated(...)
{
    while(IsFileLocked(path))
        Thread.Sleep(time);

    // OK to read
}

Вот что происходит:

- Scanner creates the file
- FileSystemWatcher detects the file, but its in use
- Scanner reads the first page to the file
- Scanner releases the file
- My code leaves the while(IsFileLocked(path))
- My code reads the incomplete file (problem)
- Scanner adds more pages to the file

Допустим, сканер сканирует 100 страниц, а затем, когда«OK, чтобы прочитать», файл будет неполным (осталось 99 страниц).

Итак, необходимо знать, завершен файл или нет.Может быть, подождать некоторое время, чтобы увидеть, был ли файл изменен, но этот промежуток времени может составлять до нескольких часов, потому что сканер может бездействовать, сканируя тот же TIF.Другим решением будет проверка некоторого флага в файле TIF, который указывает, что файл не завершен (я искал это, но ничего не нашел).

Редактировать : перед запросомздесь я прочитал документацию формата TIFF .Я нашел интересный атрибут PageNumber, но не знаю, решит ли он мою проблему

Ответы [ 3 ]

1 голос
/ 17 ноября 2011

Рассматривали ли вы метод Image.FromFile ?

Если эта функция может открыть его и прочитать допустимый tif-файл, то все в порядке.

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

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

0 голосов
/ 19 сентября 2014

вы можете проверить размер файла, если он меняется или нет:

FileInfo fi = new FileInfo(f);
long size = fi.Length;
Application.DoEvents();
System.Threading.Thread.Sleep(5000);
Application.DoEvents();
FileInfo nfi = new FileInfo(f);
long nsize = nfi.Length;
if (size == nsize)
{
    //Do function
}
0 голосов
/ 14 сентября 2012

Поскольку Ханс Пассант ответил на комментарий, единственное решение, которое я нашел полезным:

Вы не найдете элемент метаданных в файле TIFF, который говорит: «Сканер еще не завершен». Вам понадобится лучший сканер, эвристический или лучший интерфейс сканера, например WIA.

...