最稳妥的二进制文件内容比对方式是先比较文件大小,再逐字节比对;大文件应使用 filestream + span 分块流式比对,避免内存溢出;哈希校验适合多次复用场景,但需注意异常处理。

用 File.ReadAllBytes 比较二进制内容最直接
如果两个文件大小不同,肯定不一致;大小相同再逐字节比对,是最稳妥的判断方式。注意不要用 string 读取后比较,会因编码、BOM、换行符归一化等问题误判。
-
File.ReadAllBytes返回byte[],可直接用SequenceEqual比较:var b1 = File.ReadAllBytes("a.txt");<br>var b2 = File.ReadAllBytes("b.txt");<br>bool same = b1.SequenceEqual(b2); - 大文件慎用——会一次性加载全部内容到内存;超过几百 MB 就要考虑流式比对
- 该方法对空文件、隐藏属性、只读标志等元数据不敏感,只看内容字节
大文件用 FileStream + Span<byte></byte> 流式比对
避免内存爆炸,适合 GB 级文件。核心是分块读取、逐块比对,发现差异立即退出。
- 用
FileStream打开两个文件,设置FileAccess.Read和FileShare.Read - 分配固定大小缓冲区(如
new byte[8192]),用Read同步读取两文件对应块 - 用
MemoryExtensions.SequenceEqual(Span<byte>, Span<byte>)</byte></byte>比较每块(.NET Core 2.1+ / .NET 5+) - 任一读取长度不等(如一个 EOF 一个还有数据)或块内容不等,立刻返回
false
注意 File.GetLastWriteTime 不能代替内容比对
修改时间相同 ≠ 内容相同;时间可能被手动修改、同步工具覆盖、或 FAT32 文件系统精度仅到 2 秒。
-
File.GetLastWriteTime和File.GetCreationTime都只是元数据,和内容无关 - 即使配合
File.Length一起判断(大小+时间双校验),仍存在哈希碰撞级误判风险,不推荐用于准确性要求高的场景 - 仅适用于临时缓存、调试快速筛查等低风险用途
哈希校验适合远程/多次复用比对场景
当需要反复验证同一文件是否被篡改,或比对跨网络传输后的副本时,计算哈希更高效。
- 用
SHA256.Create()或MD5.Create()配合ComputeHash(Stream)流式计算,不爆内存 - 注意
MD5已不推荐用于安全场景,但纯内容一致性判断仍可用;生产环境建议用SHA256 - 哈希值相等 ≈ 内容一致(概率极小的碰撞可忽略),但首次计算有额外开销;适合“一次计算、多次比对”
- 别把哈希字符串转成
ToUpper()再比——大小写敏感,应统一小写或直接比字节数组
UnauthorizedAccessException)和路径不存在(FileNotFoundException)**,尤其在服务端或跨用户目录操作时。建议所有文件操作都包在 try/catch 中,并明确区分“无法读取”和“内容不同”这两类结果。










