1

我有一个 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 格式文档。我发现属性 PageNumber 很有趣,但不知道它是否能解决我的问题

4

3 回答 3

1

您是否考虑过Image.FromFile方法?

如果这个函数可以打开它并读取一个有效的 tif 文件,那么你就可以了。

标题的问题是它们通常位于文件的前面并首先写入,因此文件的其余部分尚未完全写入。

您可以在文件上使用排他锁来查看扫描仪是否已完成文件写入,但这取决于扫描仪软件的行为,即它是否在写入时保持文件锁定或是否保持打开/写入块/关闭/重复.

于 2011-11-17T02:05:31.640 回答
0

正如 Hans Passant 在评论中回答的那样,我发现唯一有用的解决方案是:

您不会在 TIFF 文件中找到显示“扫描仪尚未完成”的元数据项。您将需要更好的扫描仪或启发式或更好的扫描仪界面,例如 WIA。

于 2012-09-14T05:36:20.993 回答
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
}
于 2014-09-19T09:06:55.547 回答