我有一个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页,然后,当“可以阅读”时,文件将不完整(剩下99页)。
因此,有必要知道文件是否完整。也许等待一段时间来查看文件是否被修改,但这段时间可能长达数小时,因为扫描仪可以空闲扫描相同的TIF。其他解决方案是检查TIF文件中的一些标志,表明文件不完整(我已经找到了这个,但没有找到任何东西)。
编辑:在问这里之前,我已经阅读了TIFF format documentation。我发现属性PageNumber很有趣,但不知道它是否能解决我的问题
答案 0 :(得分:1)
您是否考虑过Image.FromFile方法?
如果此功能可以打开它并读取有效的tif文件,那么你没事。
标题的问题在于它们通常位于文件的前面并先写入,因此文件的其余部分尚未完全写入。
您可以对文件使用独占锁定以查看扫描程序是否已完成文件写入,但这取决于扫描仪软件的行为,即它是否在写入时保持文件锁定或是否保持打开/写入块/接近/重复。
答案 1 :(得分:0)
正如Hans Passant对评论的回答,我发现唯一有用的解决方案是:
您不会在TIFF文件中找到“扫描仪尚未完成”的元数据项。您需要更好的扫描仪或启发式或更好的扫描仪界面,如WIA。
答案 2 :(得分:0)
如果文件大小正在改变,你可以测试文件大小:
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
}