2017-11-02 11 views
-1

ある場所から別の場所にファイルを移動する(大)ファイルを処理するプログラムを作成しています。これらのファイルは通常1GB +で、私たちにとって重要なのはと信じられないほどです。当社はデータ取得会社であるため、データはとなり、文字通り当社製品です。ファイルをコピー/移動してチェックサム(md5)を同時に計算する

私は何をしたいのですがMD5(または他のいくつかの検証メソッド)を計算である - >コピー/はそれにファイルを移動先だ - >オリジナルとコピーされたファイルのMD5(または他の)を比較

計算するので、 MD5はファイル全体を読み込む必要があります。ファイルの実際のコピーと組み合わせる方法があるかどうか疑問に思っていました。

また、転送は1つのネットワークの場所から行われる可能性が高いため、両方のファイルが同じかどうかを検証するために(MD5よりも)高速で軽い方法がある場合は、教えてください。私はできればネットワークを塞ぐのを防ぎたい。

P.S.ファイル全体がでなく、というものがメモリに保存されることが重要です。その一部は300 GBにもなります。

+0

Hmm ..ちょうどあなたが送受信した各tcpパッケージのMD5を計算できませんでしたか?効率についてはわからない。また、パッケージが常に同じサイズであることを確認する必要があります。 – krizajb

+0

@krizajbすべてが同じマシン上で起こらなければならない。私は着信ファイルを計算するために宛先マシンを得ることができないので、着信TCPパケットをチェックすることができません。 –

答えて

0

私のSplitStreamは、最初の2つのことを1つのストリームで行うことができます。

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

私はあなたをすることができると思ういけない、それは

を試してみてください。しかし、最後の検証が1回の以上の読み取りが必要ですそれを避けてください。

関連する問題