2011-01-20 2 views
3

디렉토리에 파일을 작성하자 마자로드해야하는 프로그램이 있습니다. 필자는 FileSystemWatcher를 통해 디렉토리 변경을 알립니다. 변경된 이벤트를 확인하기보다는 파일을 나열하고 찾은 모든 파일을 처리하기 시작합니다. 문제는 일부 파일, (200)에 대한 1, 프로그램이 모두 0을 읽을 수 있다는 것입니다쓰기 직후 파일 읽기 모두 0이됩니다. (.net)

try { 
    fs = fi.Open(FileMode.Open, FileAccess.ReadWrite, 
        FileShare.None); 
    message = new byte[fs.Length]; 
    int br = fs.Read(message, 0, (int)fi.Length); 
} 
catch (Exception e) { 
    // I'll get it next time around 
    return; 
} 
finally { 
    if (fs != null) 
     fs.Close(); 
} 

:

여전히 내가 좋아하는 코드가 기록되는 파일을 읽으려고 방지합니다. 파일 길이는 정확하지만 내용은 모두 0 바이트로 표시됩니다. 후자의 파일을 검사 할 때 실제 정확한 데이터가 포함되어 있다는 것을 알게됩니다. 파일을 여는 방식으로 파일에 대한 조숙 한 액세스를 막을 수 있다고 생각했습니다.

DOS 명령 'copy InFile_0 * dropdir'(실행 당 약 100 개 파일)로 디렉토리에 파일을 복사하여 테스트하고 있습니다.이 명령은 사본을 두 단계로 수행합니다. 1) 공간을 할당하고 2) 공간을 채우고 내 프로그램이 가끔씩 두 곳의 중간에서 뛰게됩니다.

신뢰할 수있는 코드 작성 방법에 대한 아이디어가 있으십니까?

업데이트 : 필자는 쓰기 프로그램을 제어 할 수 없습니다. 아무 것도 될 수 있습니다. 방어적인 코드를 작성해야하는 것 같습니다.

+1

팁 : 예외에 대한 로깅을 추가하십시오. 조용히 실패하지 마십시오. – Amy

+0

파일에 잠금을 설정하지 않은 프로그램을 사용하고 있습니다. 예를 들어, C 프로그램의 경우 fopen()은 모든 프로그램이 파일을 열어 놓은 상태에서 읽고 쓸 수있게합니다."잠시 기다리십시오"를 넘어서서이기는 많은 방법이 아닙니다. –

답변

2

경쟁 조건이 발생했습니다. 확실하게 고치지 않는 한 여기에서는 네트워크 파일 시스템 등으로 더 악화 될 것입니다.

"whatever.tmp"이름을 사용하여 파일을 작성하는 프로그램을 작성한 다음 닫고 이름을 변경하십시오. 읽을 때 .tmp 파일을 무시하십시오.

또는 "sentinel"또는 길이가 같은 길이가 0 인 파일을 디렉토리에 보관하십시오. 다른 파일을 성공적으로 작성한 후 센티넬 파일을 다시 쓰는 프로그램을 파일을 작성하십시오. 그런 다음 수정 날짜/시간이 센티넬 파일의 수정 날짜/시간 인 파일을 읽지 마십시오.

파일의 작성자를 제어 할 수없는 경우 각 파일의 수정 날짜/시간을 현재 시스템 날짜/시간과 비교하여 확인하십시오. 파일을 읽으 려하기 전에 파일 크기를 적절하게 설정하십시오 (크기가 작 으면 몇 초, 크기가 클 경우 더 오래 사용하십시오).

행운을 빈다. 이것은 목에 악명 높은 통증입니다.

1

글쎄, 전 @ Ollie Jones의 이전 게시물에 동의하지 않습니다.

이미 파일에 단독 액세스를 설정 했으므로 경쟁 조건 문제가 없습니다.

필자는 작가의 행동을보다 면밀히 검토해야한다고 생각합니다. 그리고 공유, 읽기 전용으로 파일 액세스에 간섭을 줄이고 모든 액세스를 시도 :

fi.Open(FileMode.Open, FileAccess.Read, FileShare.ReadWrite); 

이것은 당신의 읽기를 실패 할 수 있지만 쓰기 오류를 줄일 수 있습니다. 안전하게 읽을 시간을 결정하기 위해 파일 시간이나 파일 크기 등을 확인할 수 있습니다. 이후에 많은 파일이 기록되면 두 번째 파일을 만든 후 첫 번째 파일을 읽을 수 있습니다.

+0

원래 FileAccess.Read를 열었고 파일이 0 인 것과 동일한 문제가있었습니다. 여는 .ReadWrite는 그 문제를 해결하기위한 시도였습니다. 필자가 쓰기 권한을 요청하면 모든 작성자가 파일을 실제로 끝낼 때까지 파일에 대한 액세스가 지연 될 수 있다고 생각했습니다. – TomU

+0

FileShare.ReadWrite가 어떻게 문제를 해결하는지 알지 못합니다. 그것보다 더 관대합니다. 그리고 나는 덜 관대 할 필요가 있습니다. 게다가, 문서는 "후속 열기"라고 말합니다. 나는 작가와 계속 이어지기 때문에 나는 작가가 열리 길 원한다. 그러나 나는 그것에 대한 통제권이 없다. 물론, 설명서를 잘못 해석하거나 문서가 잘못되었을 수 있습니다. – TomU