2011-11-16 73 views
1

我有一个FileSystemWatcher监视从扫描设备接收TIF文件的目录。检查TIFF文件扫描是否完成

有必要检查扫描过程是否完成,然后处理完全扫描的文件,否则,我的程序将处理不完整的文件。

我有类似:

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 format documentation。我发现属性PageNumber有趣,但不知道它是否会解决我的问题

+2

什么的'FileInUse'功能吗? – vlad

+1

您可以查询扫描仪了解扫描完成时间吗? – UnhandledExcepSean

+0

它验证如果任何程序正在读取文件,我把这种方式来保持它简单,但它做类似于:http://stackoverflow.com/questions/876473/is-there-a-way-to-check如果一个文件正在使用 这个方法的一个更好的名字是IsFileLocked –

回答

0

汉斯·帕桑特上评论说,我发现有用的唯一的解决办法是:

你不会找到TIFF文件,上面写着一个元数据项“扫描仪尚未完成” 。您需要更好的扫描仪或启发式扫描仪或更好的扫描仪界面,如WIA。

1

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

如果此功能可以打开它并阅读有效的tif文件,那么你没事。

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

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

+0

我会尝试尽可能,谢谢。但是,即使只有一页,Tiff文件也会被成功读取,对吗? –

+0

这一切都取决于格式,即一个文件被正确读取,它可能必须在那里。我不是100%确定.NET是否处理多页面tiff - 这是你似乎暗示的。因此,专有文件锁定方法可能是另一种选择;毕竟只是提出了一些建议。 –

+0

Image.FromFile将无法确定它是否完整,因为我只能打开它一页。 我已经尝试过独占文件锁定,看看我的问题。 –

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 
}