FileSystemWatcher.waitforCchanged returns이지만 파일에 여전히 잠금이 있습니다.

StackOverflow https://stackoverflow.com/questions/561467

문제

PDF 프린터 드라이버에 문서를 보내는 프로그램이 있으며 해당 드라이버는 특정 디렉토리에 인쇄합니다. 인쇄 후 PDF를 이메일 (MailMessage)에 첨부하고 보내려고합니다.

지금, 나는 문서를 프린터로 보낸 다음 (새 프로세스를 생성한다) 파일 시스템 워처를 호출합니다. WaitforChanged (WaitforChangedresult.created) 그러나 객체가 만들어지면 여전히 "프린팅"이 완료되지 않았으며 PDF 프린터는 여전히 그 파일을 이메일에 첨부하려고 할 때 오류를 던지십시오.

  • 나는 평범한 실을 고려했다.
  • 첨부 파일 코드를 시도/캐치 블록에 넣고 실패에 대한 루핑을 고려했지만 다시 한 번 나쁜 소식입니다.

나는 우아한 솔루션을 실제로 생각할 수 없습니다.

도움이 되었습니까?

해결책

대기 중입니다 생성 된 이벤트를 기다리고 있습니다 당신이 그것을 코딩했듯이. 문서가 생성되면 알림을받습니다. 이는 파일이 완전히 작성되고 잠금이 제거되었음을 의미하지는 않습니다.

안타깝게도 파일을 주기적으로 폴링하는 것 외에는 좋은 솔루션을 모릅니다. "모든 잠금 장치가 제거 된"이벤트가 있으면 사용할 수 있지만 그렇지 않습니다.

방금 PDF 덤프를 디렉토리 코드로 확인했으며 WaitforChanges 만 사용하여 새 파일의 시작을 감지합니다. 그런 다음 Catch (파일에 대한 권한을 얻지 못하는)가 우리가 유지 관리하는 큐로 시도를 다시 제출하는 시도 {} catch {}를 사용합니다. 각 시도는 "백 오프"를 더 오래 사용하여 감지 한 후 1 초입니다. 파일, 두 번째는 2 초 후에 4, 8 등입니다. 이는 큰 파일의 숫자 재시도를 줄이면서 더 짧은 파일에 상당히 반응합니다.

다른 팁

글쎄, 감시자가 파일을보고 변경 될 때마다 알리는 한, 파일이 여전히 잠겨있는 동안 (여전히 작성되고 있음)가 발생하는 변경 알림을 무시하고 신호를 보내는 궁극적 인 변경 알림을 기다릴 수 있습니다. 마지막 쓰기 이벤트는 파일에 액세스 할 수 있어야합니다 (이 시점에서 마침내 시계를 비활성화 할 수 있음).

그 외에는 감시자가 "파일 폐쇄"이벤트 Afaik이 없기 때문에 당신이 무엇을 할 수 있는지 잘 모르겠습니다.

AFAIK 오류 처리없이 파일 잠금을 확인할 방법이 없습니다.

PDF 프린터가 새로운 프로세스로 시작합니까? 그러면 해당 프로세스를 모니터링 할 수 있어야 하며이 프로세스가 종료되면 파일이 잠금 해제됩니다.

이를 위해 Adobe의 Acrobat을 사용하는 경우 Acrodist.exe (내 머리 상단에서 /n 스위치를 원함)로 PDF를 생성 한 다음 스폰 된 프로세스가 종료 될 때까지 기다릴 수 있습니다.

라이센스 : CC-BY-SA ~와 함께 속성
제휴하지 않습니다 StackOverflow
scroll top