문제

FileSystemWatcher를 사용하여 디렉터리에서 새 파일을 모니터링하는 여러 .NET 응용 프로그램이 있습니다.파일은 다른 위치에서 복사되고 FTP 등을 통해 업로드됩니다. 파일이 들어 오면 파일이 어떤 방식 으로든 처리됩니다.그러나 만족스러운 대답을 본 적이없는 한 가지 문제는 큰 파일의 경우 모니터링중인 파일이 아직 기록되고있는시기를 어떻게 알 수 있습니까?당연히 파일 처리를 시작하기 전에 파일이 완료되고 닫힐 때까지 기다려야합니다.FileSystemWatcher 이벤트의 이벤트 인수는이 문제를 해결하지 못하는 것 같습니다.

도움이 되었습니까?

해결책

파일에 대한 쓰기 잠금을 시도해 보셨습니까?작성중인 경우 실패해야하며 잠시 동안 그대로 두어야합니다 ...

다른 팁

파일을 디렉토리에 쓰는 프로그램을 제어하고 있다면 프로그램이 파일을 임시 디렉토리에 기록한 다음 감시 디렉토리로 이동하도록 할 수 있습니다.이동은 원자 적 작업이어야하므로 감시자는 파일이 디렉토리에 완전히있을 때까지 파일을 볼 수 없습니다.

감시 된 디렉토리에 기록하는 내용을 제어 할 수없는 경우 주어진 시간 동안 파일이 동일한 크기로 유지되었을 때 파일이 완료된 것으로 간주되는 감시자에서 시간을 설정할 수 있습니다.즉각적인 처리가 문제가되지 않는 경우이 타이머를 비교적 큰 값으로 설정하면 파일이 완료되었는지 여부를 알 수있는 상당히 안전한 방법입니다.

파일의 내용이 완료되었는지 확인할 수없는 경우 (확인 가능한 형식이 있거나 내용의 체크섬이 포함되어 있음) 발신자 만 전체 파일이 도착했는지 확인할 수 있습니다.

예전에 FTP를 통해 대용량 파일을 보낼 때 잠금 방식을 사용했습니다.

파일은 대체 확장자로 전송되며 발신자가 만족하면 이름이 변경됩니다.

위는 임시 확장자로 오래된 파일을 주기적으로 정리하는 프로세스와 분명히 결합됩니다.

대안은 이름은 같지만 추가 .lck 확장자를 가진 길이가 0 인 파일을 만드는 것입니다.실제 파일이 완전히 업로드되면 lck 파일이 삭제됩니다.수신 프로세스는 잠금 파일 이름을 가진 파일을 분명히 무시합니다.

이러한 시스템이 없으면 수신자는 전체 파일이 도착했는지 확인할 수 없습니다.

x 분 동안 변경되지 않은 파일을 확인하면 모든 종류의 문제가 발생하기 쉽습니다.

다음 방법은 쓰기 권한으로 파일을 열려고합니다.파일이 디스크에 완전히 기록 될 때까지 실행을 차단합니다. 라코 디스

( 관련 질문 )

대역 외 신호를 보내야 할 것입니다. "file.ext"제작자에게 더미 "file.ext.end"를 작성하도록합니다.

+1은 가능한 경우 file.ext.end 시그널 러를 사용합니다. 여기서 file.ext.end의 내용은 더 큰 파일에 대한 체크섬입니다.이것은 보안을위한 것이 아니라 도중에 아무 것도 왜곡되지 않도록하는 것입니다.누군가 자신의 파일을 대용량 스트림에 삽입 할 수 있다면 체크섬도 교체 할 수 있습니다.

파일 업로드가 도중에 실패하고 발신자가 아직 파일을 재전송 (및 재 잠금)하지 않은 경우 쓰기 잠금이 도움이되지 않습니다.

파일이 ftp에 의해 완전히 업로드되었는지 Windows에서 확인하는 방법은 이름을 바꾸는 것입니다.이름 변경이 실패하면 파일이 완료되지 않은 것입니다.별로 우아하지는 않지만 작동합니다.

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