2009-07-20 5 views
12

새 파일의 폴더를 모니터링하고 처리해야합니다. 문제는 파일 열기가 실패하기 때문에 시스템이 파일 복사를 완료하지 않았기 때문입니다.파일이 .NET에서 완전히 복사되었는지 테스트하는 방법

파일 복사가 완료되면 올바른 테스트 방법은 무엇입니까?

설명 : 폴더/파일에 대한 쓰기 권한이 없으며 복사 프로세스를 제어 할 수 없습니다 (사용자).

+0

좋은 질문입니다! 그 문제가 생겼을 때 방금 System.Threading.Thread.Sleep (1000)을 추가했지만 더 나은 솔루션을 얻으려고 애쓸 것입니다. (그냥 절름발이입니다 ...) – Treb

+0

원본 파일에 대한 읽기 권한이 있습니까? 어느 것이 복사되고 있는가? –

답변

11

이 작업을 수행하는 유일한 방법은 파일을 독점적으로 열고 특정 예외를 잡으려고하는 것입니다.나는 보통 일반 응용 프로그램 논리에 대한 예외를 사용하여 싫어,하지만 난 (나는 아직 하나를 발견하지 않았습니다 적어도) 다른 방법이 없습니다이 시나리오 두려워 :

public bool FileIsDone(string path) 
{ 
    try 
    { 
    using (File.Open(path, FileMode.Open, FileAccess.Read, FileShare.None)) 
    { 
    } 
    } 
    catch(UnauthorizedAccessException) 
    { 
    return false; 
    } 

    return true; 
} 
0

내가 취하는 접근법 중 하나는 내용이없는 "token.txt"라는 이름의 복사/전송 마지막에 파일을 만드는 것입니다. 이 파일은 전송 작업이 끝난 시점에서 생성되므로이 파일 생성을 모니터링 할 수 있으며이 파일을 만들면 파일 작업을 시작할 수 있습니다. 파일을 처리하기 시작할 때 항상이 토큰 파일을 지우는 것을 잊지 마십시오. 또한 같은 경우 포함해야한다

+1

그러나 사용자 계정에 서버의 파일을 삭제할 권한이없는 경우이 접근법은 유용하지 않습니다. – rahul

+2

extropy가 자신이 제어 할 수있는 복사 프로세스를 기다리고 있다고 생각하지 마십시오. 그렇다면 토큰 파일이 없을 것입니다. – peSHIr

+1

나는 그가 세부적인 내용없이 프로세스없이 접근/통제하지 못했다고 말할 수 없다고 생각한다. 모두가 의견을 제시하는 브레인 스토밍과 같습니다. –

0

: 파일 ... 파일 (복사가 성공하지 못했습니다) 등 삭제, 다른 프로그램에서 사용하고

를 사용하여 발생할 수있는 모든 중요한 사건을 다루 처리 확장 예외입니다.

2

"올바른 방법"에 대해 확실하지 않지만 모니터링 도구 (FileSystemWatcher)를 사용하여 지연 처리에 사용하는 내부 대기열을 채울 수 있습니다. 아니면 더 나은 방법은 : 큐를 사용하여 열기가 실패한 파일을 배치하면 나중에 다시 시도 할 수 있습니다.

1

FileSystemWatcher을 사용하는 경우이 문제에 대한 강력한 해결책이 있다고 생각하지 않습니다. 한 가지 방법은 나중에 try/catch/retry가 될 것입니다.

0

복사 프로세스를 제어 할 수 없다면 재시도 루프가 가장 좋습니다.

당신이있는 경우 제어 : 폴더가 로컬

  • 경우, 당신은 그것으로 물건을 쓰는 사람들이 독점적 인 액세스를 위해 파일을 잠글 것을 요구 수 있고, 그들이 수행하는 경우에만 (잠금을 해제하는 나는 File.Copy에 대한 기본값이라고 생각한다). .Net 측에서 간단한 재시도 루프를 만들 수 있습니다.
    • 또는 임시 폴더에 파일을 쓸 수 있으며 작성한 후에 만 ​​대상 디렉토리로 이동할 수 있습니다. 이 LockFile도 작동하지 않습니다 기회 (일부 리눅스 구현)이 나쁜 물건이 일어날 수있는 창을 감소 (하지만 제거하지 않습니다) 폴더가 SMB 공유 인 경우
  • 합니다. 이 경우 일반적인 접근법은 파일을 만드는 사람이 완료되면 삭제되는 일종의 잠금 파일을 갖는 것입니다. 잠금 파일 접근 방식의 문제점은 삭제하는 것을 잊어 버리면 문제가 될 수 있다는 것입니다.
  • 이러한 복잡성 때문에 WCF 서비스 또는 웹 서비스를 통해 데이터를받는 것이 훨씬 더 효율적으로 제어 할 수있는 이점이 될 수 있습니다.
0

사실, 경쟁 조건의를 피하기는 안전한 해결책은 다시 시도하는 것입니다.

당신이 할 경우 같은 것을 : 당신은 잠시 가드와 프로세스 파일 문 사이에 점프 다른 프로세스를 위험

while (file is locked) 
    no-op() 
process file() 

. "파일 가용성 대기"가 어떻게 구현 되든간에 게시 후 잠금을 통해 액세스 할 수있는 첫 번째 프로세스가 아닌 한 이 아닌 첫 번째 사용자가 일 수 있습니다.

특히 파일 시스템 감시자와 같은 것을 사용하는 경우 특히 여러 사람이 파일을보고있는 경우 일견 보일 수 있습니다. 물론, 그때도 여전히 그렇진 않을 것입니다 ...

0

파일이 큽니까?

아마도 파일의 md5 체크섬을 계산할 수 있습니까?

파일 이름에 md5 해시를 넣으면 파일을 검색하고 파일의 체크섬을 다시 계산하십시오. md5가 일치하면 파일이 완료되었다고 가정 할 수 있습니다.

byte[] md5Hash = null; 
MD5 md5 = new MD5CryptoServiceProvider(); 
using (FileStream fs = new FileStream(path, FileMode.Open, FileAccess.Read)) 
    md5Hash = md5.ComputeHash(fs); 

StringBuilder hex = new StringBuilder(); 
foreach (byte b in md5Hash) 
    hex.Append(b.ToString("x2")); 
0

다음은 내가 사용하는 vb.net 루프입니다. 각 점검 사이에 2 초 정도 기다립니다.

Dim donotcopy As Boolean = True 
While donotcopy = True 
    Dim myFile As New FileInfo("Filetocopy") 
    Dim sizeInBytes As Long = myFile.Length 
    Thread.Sleep(2000) 
    Dim myFile2 As New FileInfo("Filetocopy") 
    Dim sizeInBytes2 As Long = myFile2.Length 
    If sizeInBytes2 = sizeInBytes Then donotcopy = False 
End While 
관련 문제