2011-11-16 3 views
1

검사 장치에서 TIF 파일을받는 디렉토리를 모니터링하는 FileSystemWatcher가 있습니다.TIFF 파일 검사가 완료되었는지 확인하십시오.

검색 프로세스가 완료되었는지 확인한 다음 완전히 스캔 한 파일을 처리해야합니다. 그렇지 않으면 프로그램이 불완전한 파일을 처리합니다.

- 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 

은의이 스캐너가 "읽기 OK"할 때, 파일 것, 다음, 100 페이지를 스캔되어 있다고 가정 해 봅시다 :

private void OnFileCreated(...) 
{ 
    while(IsFileLocked(path)) 
     Thread.Sleep(time); 

    // OK to read 
} 

이 일어나고있는 것입니다 :

나는 뭔가처럼이 불완전하다 (99 페이지 남음).

따라서 파일이 완전한지 여부를 확인해야합니다. 스캐너가 동일한 TIF 검사를 유휴 상태로 만들 수 있기 때문에 파일이 수정되었는지 잠시 기다려야하지만이 시간 범위는 최대 시간이 될 수 있습니다. 다른 해결책은 파일이 완료되지 않았 음을 나타내는 TIF 파일의 플래그를 검사하는 것입니다 (이 파일을 찾았지만 아무 것도 발견하지 못했습니다).

: 여기에 묻기 전에 TIFF format documentation을 읽었습니다. 흥미로운 PageNumber 속성을 발견했지만 내 문제를 해결할 수 있을지 모르겠다.

+2

은'FileInUse' 기능은 무엇입니까? – vlad

+1

스캐너를 쿼리하여 스캔이 완료된 시간을 확인할 수 있습니까? – UnhandledExcepSean

+0

어떤 프로그램이 파일을 읽는지 확인합니다. 간단하게 유지하기 위해이 방법을 사용합니다. 그러나 다음과 비슷한 것을합니다 : http://stackoverflow.com/questions/876473/is-there-a-way-to-check -if-a-file-in-use 이 방법의 더 좋은 이름은 IsFileLocked입니다. –

답변

0

한스 옆모습이 코멘트에 대답으로, 내가 유용한 발견하는 유일한 솔루션입니다 :

당신은 말한다 TIFF 파일에 메타 데이터 항목을 찾을려고하고 있지 않다 "는 스캐너가 아직 수행되지 않습니다" . WIA와 같은 더 나은 스캐너 또는 경험적 스캐너 인터페이스가 필요합니다. 이 변경하거나 있지 않은 경우

1

Image.FromFile 방법을 고려 했습니까?

이 기능을 열어 유효한 tif 파일을 읽을 수 있으면 괜찮습니다.

헤더의 문제점은 일반적으로 파일의 앞쪽에 쓰여 있고 처음에 쓰여지므로 나머지 파일은 아직 완전히 쓰여지지 않은 것입니다.

스캐너에 파일 쓰기가 끝났는지 여부를 확인하기 위해 파일에 단독 잠금을 사용할 수 있지만 스캐너 소프트웨어의 동작에 따라 달라집니다. 즉, 파일을 기록 할 때 잠긴 상태로 유지하거나 열기/쓰기 블록을 유지하는지 여부/닫기/반복.

+0

감사합니다. 그러나 Tiff 파일은 한 페이지만으로도 성공적으로 읽힐 것입니다. 맞습니까? –

+0

모두 형식에 따라 달라집니다. 즉, 파일을 올바르게 읽으려면 파일이 모두 있어야 할 수도 있습니다. .NET이 다중 페이지 티프를 처리하는 경우 100 % 확실하지 않습니다. 이것이 당신이 암시하는 것입니다. 따라서 독점적 인 파일 잠금 방식이 대안이 될 수 있습니다. 어쨌든 단지 suggstions. –

+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 
}