检查TIFF文件扫描是否完成

时间:2011-11-16 16:20:31

标签: c# tiff filesystemwatcher scanning

我有一个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很有趣,但不知道它是否能解决我的问题

3 个答案:

答案 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
}