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



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

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

由于计算MD5需要读取整个文件,我想知道是否有一种方法可以将其与文件的实际副本结合起来,要求从头到尾只读取一次。

此外,传输可能会从一个网络位置转移到另一个位置,因此,如果有比MD5更快/更轻的方法来验证两个文件是否相同,请告诉我!如果可以的话,我想防止网络瘫痪。

附言:重要的是要将整个文件而不是存储在内存中,因为其中一些文件可能会大到300 GB。

My 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

我还没有在这么大的文件上测试过它,但请尝试一下

但最后一次验证需要再读一次,我认为你无法避免。

最新更新