检查TIFF文件扫描是否完成
本文关键字:是否 扫描 TIFF 文件 检查 | 更新日期: 2023-09-27 18:14:56
我有一个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 to read"时,文件将是不完整的(剩下99页)。
所以,有必要知道文件是否完整。可能需要等待一段时间来查看文件是否被修改,但这个时间跨度可能长达几个小时,因为扫描相同的TIF时扫描仪可能会空闲。其他解决方案是检查TIF文件中的一些标志,表明文件不完整(我已经寻找了这个,但没有找到任何东西)。
Edit:在提问之前,我已经阅读了TIFF格式的文档。我发现属性PageNumber很有趣,但不知道它是否会解决我的问题
您是否考虑过图像。FromFile方法?
如果这个函数可以打开它并读取一个有效的tif文件,那么你就可以了。
头文件的问题是,它们通常在文件的前面,首先写入,所以文件的其余部分还没有完全写入。
你可以在文件上使用排他锁来查看扫描器是否已经完成对文件的写入,但这取决于扫描器软件的行为,即它是否在写入时保持文件锁定或保持打开/写块/关闭/重复
正如Hans Passant在评论中回答的那样,我发现唯一有用的解决方案是:
您不会在TIFF文件中找到一个元数据项,表示"扫描仪尚未完成"。你需要一个更好的扫描器,或者一个启发式的,或者一个更好的扫描器接口,比如WIA。
你可以测试文件大小是否在改变:
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
}