2011-11-16 30 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 
}