我有一个MemoryStream包含PNG编码图像的字节,并想检查磁盘上的目录中是否有完全相同的图像数据.第一个显而易见的步骤是只查找与确切长度匹配的文件,但在此之后我想知道将内存与文件进行比较的最有效方法是什么.我在使用溪流时不是很有经验.
我对此事有几点想法:
首先,如果我能得到文件的哈希码,那么(可能)比较哈希码而不是图像的每个字节都会更有效.同样,我可以比较图像的一些字节,给出“足够接近”的答案.
然后当然我可以比较整个流,但我不知道会有多快.
解决方法
首先,获取两个流的哈希码无济于事 – 计算哈希码时,您需要读取整个内容并在读取时执行一些简单的计算.如果您逐个字节地比较文件或使用缓冲区,那么您可以提前停止(在找到前两个字节/块之后)不匹配.
但是,如果您需要将MemoryStream与多个文件进行比较,这种方法是有意义的,因为那时您只需要遍历MemoryStream一次(计算哈希码)并循环遍历所有文件.
在任何情况下,您都必须编写代码来读取整个文件.正如您所提到的,这可以是逐字节或使用缓冲区完成的.将数据读入缓冲区是一个好主意,因为从HDD读取时可能是更有效的操作(例如,读取1kB缓冲区).此外,如果需要并行处理多个文件,可以使用异步BeginRead方法.
摘要:
>如果需要比较多个文件,请使用哈希码
>读取/比较单个文件的内容:
>从两个流中读取1kB数据到缓冲区
>看看是否有差异(如果是,退出)
>继续循环
如果需要并行处理多个文件,请使用BeginRead异步实现上述步骤.