复制/移动文件并同时计算校验和(md5)

时间:2017-11-02 21:55:31

标签: c# md5 checksum file-copying

我正在整理一个程序,负责将(大)文件从一个地方移动到另一个地方。这些文件通常是1gb +,对我们来说非常重要 。我们是一家数据采集公司,所以数据字面我们的产品。

我想做的是计算MD5(或其他一些验证方法) - >将文件复制/移动到目的地 - >比较原始文件和复制文件的MD5(或其他)

由于计算MD5需要读取整个文件,我想知道是否有办法将它与文件的实际副本相结合,要求它只能从头开始结束一次。

此外,转移可能是从一个网络位置到另一个网络位置,因此如果有更快/更轻(比MD5)的方式来验证两个文件是相同的,请告诉我!如果可以的话,我想防止网络陷入困境。

P.S。重要的是整个文件存储在内存中,因为其中一些文件可能会达到300 GB。

1 个答案:

答案 0 :(得分: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

我没有对这么大的文件进行测试,但是试一试

但最后一次验证需要多读一遍,我不认为你可以避免这种情况。