2017-11-02 2 views
-1

이동하는 (큰) 파일을 한 곳에서 다른 곳으로 옮기는 프로그램을 작성 중입니다. 이 파일은 일반적으로 1GB +이고 매우 입니다. 우리에게 중요한 파일은입니다. 우리는 데이터 수집 회사이므로 데이터는 그대로 저희 제품입니다. > 원본과 복사 된 파일의 MD5 비교 (또는 다른)동시에 파일 복사/이동 및 체크섬 (md5) 계산

계산하기 때문에 - 그것은 목적지의에> 복사/파일을 이동 - 내가하고 싶은 무엇

는 MD5 (또는 다른 검증 방법)을 계산이다 MD5는 전체 파일을 읽는 것을 요구합니다. 파일의 실제 사본과 결합하여 한 번만 끝나기 시작하도록 요구하는 방법이 있는지 궁금합니다.

또한 전송은 네트워크 위치에 따라 달라질 수 있으므로 MD5보다 빠르거나 가벼운 방법으로 두 파일이 동일한 지 확인하려면 알려 주시기 바랍니다. 나는 할 수 있으면 망설이는 것을 막고 싶다.

P. 이 아닌 파일 전체가 300GB까지 커질 수 있으므로 메모리에 저장하는 것이 중요합니다.

+0

음 .. 보내고받은 각 tcp 패키지에 대해 MD5를 계산할 수는 없습니까? 효율성에 대해 확실하지 않습니다. 또한 패키지가 항상 동일한 크기인지 확인해야합니다. – krizajb

+0

@krizajb 모든 것이 동일한 기계에서 이루어져야합니다. 들어오는 파일을 계산할 대상 컴퓨터를 가져올 수 없으므로 들어오는 tcp 패킷을 검사 할 수 없습니다. –

답변

0

내 SplitStream은 하나의 스트림으로 처음 두 가지 작업을 수행 할 수 있습니다.

using (var inputSplitStream = new ReadableSplitStream(inputSourceStream)) 

using (var inputFileStream = inputSplitStream.GetForwardReadOnlyStream()) 
using (var outputFileStream = File.OpenWrite("MyFileOnAnyFilestore.bin")) 

using (var inputSha1Stream = inputSplitStream.GetForwardReadOnlyStream()) 
using (var outputSha1Stream = SHA1.Create()) 
{ 
    inputSplitStream.StartReadAhead(); 

    Parallel.Invoke(
     () => { 
      var bytes = outputSha1Stream.ComputeHash(inputSha1Stream); 
      var checksumSha1 = string.Join("", bytes.Select(x => x.ToString("x"))); 
     }, 
     () => { 
      inputFileStream.CopyTo(outputFileStream); 
     }, 
    ); 
} 

GitHub의 : 나는 힘든 대형 파일에 그것을 테스트,하지만 포기하지 않은 https://github.com/microknights/SplitStream

내가 당신을 수 있다고 생각 해달라고, 그것은

을 시도하지만 마지막 유효성 검사가 한 번 더 읽기가 필요합니다 그것을 피하십시오.