Skip to the content.

文件摘要与重复发现设计

使用入口见 Core README,实现见 FileHashHelper。

摘要使用 .NET SHA-256 异步流接口。文件重载自己打开和释放流;流重载保留调用者流。重复发现不缓存文件正文,路径、元数据、分组和结果占用随输入路径数增长的内存。

重复发现依次执行路径规范化、去重、读取长度、按长度分组,再只对至少两个不同路径的组计算摘要。长度与摘要相同的组成为候选,不再做逐字节确认,也不删除或维护文件索引。

路径使用 Path.GetFullPath;Windows 按不区分大小写的序数比较,其他系统按区分大小写的序数比较,不探测挂载点设置。相对/绝对及点路径可以合并,符号链接和硬链接不解析为物理身份。相同路径不同大小写表达选择序数最小者,组内路径及组间首路径按序数排序,保证结果不依赖枚举顺序。

候选收集、读取前后比较长度和最后修改时间,并核对读取位置;文件流使用 FileShare.Read。这些检测不能保证快照:同长度改写、时间戳粒度、路径替换、平台共享规则及读取后的再次修改仍可能影响判断。应用据此删除或建立持久索引时,需要自己的版本校验与并发规则。

缺失、不可访问、目录输入、枚举器异常或检测到变化均使整个调用失败。非候选文件仍验证元数据可读,但不打开内容。取消覆盖枚举、分组和异步读取;同步枚举器或忽略令牌的流不能被强行中断。

验证见 FileHashHelperTests,包括空内容、非定位短读、重复路径、同长度不同内容、稳定排序、文件变化与取消。SHA-256 是内容摘要,认证需求应使用带密钥的接口。