将内存流与文件C#.NET进行比较的最有效方法

dev*_*os1 9 .net c# comparison image file

我有一个MemoryStream包含PNG编码图像的字节,并想检查磁盘上的目录中是否有完全相同的图像数据.第一个显而易见的步骤是只查找与确切长度匹配的文件,但在此之后我想知道将内存与文件进行比较的最有效方法是什么.我在使用溪流时不是很有经验.

我对此事有几点想法:

首先,如果我能得到文件的哈希码,那么(可能)比较哈希码而不是图像的每个字节都会更有效.同样,我可以比较图像的一些字节,给出"足够接近"的答案.

然后当然我可以比较整个流,但我不知道会有多快.

将MemoryStream与文件进行比较的最佳方法是什么?for循环中逐字节的字节?

Cod*_*313 21

另一种方案:

private static bool CompareMemoryStreams(MemoryStream ms1, MemoryStream ms2)
{
    if (ms1.Length != ms2.Length)
        return false;
    ms1.Position = 0;
    ms2.Position = 0;

    var msArray1 = ms1.ToArray();
    var msArray2 = ms2.ToArray();

    return msArray1.SequenceEqual(msArray2);
}
Run Code Online (Sandbox Code Playgroud)


Tom*_*cek 11

首先,获取两个流的哈希码无济于事 - 计算哈希码时,您需要读取整个内容在读取时执行一些简单的计算.如果您逐个字节地比较文件或使用缓冲区,那么您可以提前停止(在找到前两个字节/块之后)不匹配.

但是,如果你需要比较MemoryStream多个文件,这种方法是有意义的,因为那时你需要循环MemoryStream一次(计算哈希码)并循环遍历所有文件.

在任何情况下,您都必须编写代码来读取整个文件.正如您所提到的,这可以是逐字节或使用缓冲区完成的.将数据读入缓冲区是一个好主意,因为从HDD读取时可能更有效(例如读取1kB缓冲区).此外,BeginRead如果需要并行处理多个文件,可以使用异步方法.

摘要:

  • 如果需要比较多个文件,请使用哈希码
  • 读取/比较单个文件的内容:
    • 从两个流中将1kB数据读入缓冲区
    • 看看是否有差异(如果是,退出)
    • 继续循环

BeginRead如果需要并行处理多个文件,请异步使用上述步骤.