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

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

我对此事有几点想法:

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

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

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

解决方法

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

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

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

摘要:

>如果需要比较多个文件,请使用哈希码
>读取/比较单个文件的内容:

>从两个流中读取1kB数据到缓冲区
>看看是否有差异(如果是,退出)
>继续循环

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

相关文章

项目中经常遇到CSV文件的读写需求,其中的难点主要是CSV文件...
简介 本文的初衷是希望帮助那些有其它平台视觉算法开发经验的...
这篇文章主要简单记录一下C#项目的dll文件管理方法,以便后期...
在C#中的使用JSON序列化及反序列化时,推荐使用Json.NET——...
事件总线是对发布-订阅模式的一种实现,是一种集中式事件处理...
通用翻译API的HTTPS 地址为https://fanyi-api.baidu.com/api...