새 파일의 폴더를 모니터링하고 처리해야합니다. 문제는 파일 열기가 실패하기 때문에 시스템이 파일 복사를 완료하지 않았기 때문입니다.파일이 .NET에서 완전히 복사되었는지 테스트하는 방법
파일 복사가 완료되면 올바른 테스트 방법은 무엇입니까?
설명 : 폴더/파일에 대한 쓰기 권한이 없으며 복사 프로세스를 제어 할 수 없습니다 (사용자).
새 파일의 폴더를 모니터링하고 처리해야합니다. 문제는 파일 열기가 실패하기 때문에 시스템이 파일 복사를 완료하지 않았기 때문입니다.파일이 .NET에서 완전히 복사되었는지 테스트하는 방법
파일 복사가 완료되면 올바른 테스트 방법은 무엇입니까?
설명 : 폴더/파일에 대한 쓰기 권한이 없으며 복사 프로세스를 제어 할 수 없습니다 (사용자).
이 작업을 수행하는 유일한 방법은 파일을 독점적으로 열고 특정 예외를 잡으려고하는 것입니다.나는 보통 일반 응용 프로그램 논리에 대한 예외를 사용하여 싫어,하지만 난 (나는 아직 하나를 발견하지 않았습니다 적어도) 다른 방법이 없습니다이 시나리오 두려워 :
public bool FileIsDone(string path)
{
try
{
using (File.Open(path, FileMode.Open, FileAccess.Read, FileShare.None))
{
}
}
catch(UnauthorizedAccessException)
{
return false;
}
return true;
}
내가 취하는 접근법 중 하나는 내용이없는 "token.txt"라는 이름의 복사/전송 마지막에 파일을 만드는 것입니다. 이 파일은 전송 작업이 끝난 시점에서 생성되므로이 파일 생성을 모니터링 할 수 있으며이 파일을 만들면 파일 작업을 시작할 수 있습니다. 파일을 처리하기 시작할 때 항상이 토큰 파일을 지우는 것을 잊지 마십시오. 또한 같은 경우 포함해야한다
: 파일 ... 파일 (복사가 성공하지 못했습니다) 등 삭제, 다른 프로그램에서 사용하고
를 사용하여 발생할 수있는 모든 중요한 사건을 다루 처리 확장 예외입니다."올바른 방법"에 대해 확실하지 않지만 모니터링 도구 (FileSystemWatcher
)를 사용하여 지연 처리에 사용하는 내부 대기열을 채울 수 있습니다. 아니면 더 나은 방법은 : 큐를 사용하여 열기가 실패한 파일을 배치하면 나중에 다시 시도 할 수 있습니다.
FileSystemWatcher을 사용하는 경우이 문제에 대한 강력한 해결책이 있다고 생각하지 않습니다. 한 가지 방법은 나중에 try/catch/retry가 될 것입니다.
복사 프로세스를 제어 할 수 없다면 재시도 루프가 가장 좋습니다.
당신이있는 경우 제어 : 폴더가 로컬
사실, 경쟁 조건의를 피하기는 안전한 해결책은 다시 시도하는 것입니다.
당신이 할 경우 같은 것을 : 당신은 잠시 가드와 프로세스 파일 문 사이에 점프 다른 프로세스를 위험
while (file is locked)
no-op()
process file()
. "파일 가용성 대기"가 어떻게 구현 되든간에 게시 후 잠금을 통해 액세스 할 수있는 첫 번째 프로세스가 아닌 한 이 아닌 첫 번째 사용자가 일 수 있습니다.
특히 파일 시스템 감시자와 같은 것을 사용하는 경우 특히 여러 사람이 파일을보고있는 경우 일견 보일 수 있습니다. 물론, 그때도 여전히 그렇진 않을 것입니다 ...
파일이 큽니까?
아마도 파일의 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"));
다음은 내가 사용하는 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
좋은 질문입니다! 그 문제가 생겼을 때 방금 System.Threading.Thread.Sleep (1000)을 추가했지만 더 나은 솔루션을 얻으려고 애쓸 것입니다. (그냥 절름발이입니다 ...) – Treb
원본 파일에 대한 읽기 권한이 있습니까? 어느 것이 복사되고 있는가? –