作者:eaglet
转载请注明出处
我所做的系统需要比较文件时间和大小来确定两个文件是否相同,但在运行过程中,经常会发现文件时间被莫名其妙的修改了1-2秒。这个问题我一直没有仔细去研究,一直以为是微软的一个bug,直到最近发现这个问题不搞清楚实在是不行了,系统经常会从服务器下载相同的文件。今天仔细研究了一下这个问题,发现并不是微软操作系统的问题,而是文件系统设计的问题。
直接切入正题
FAT32 文件系统采用FAT表(文件分配表)来存储文件的索引信息,为了尽量减少FAT表中每个文件占用的空间数量, FAT32 文件系统将文件大小限制为小于4GB, 文件时间精度限制为2秒,以偶数对齐。而NTFS文件系统采用的是MFT表(主文件表)来存储文件的元数据,这个主文件表相当于一个小的数据库,它可以存储更多的元数据。所以NTFS文件系统无论是文件大小还是文件时间精度都远远高于FAT32. NTFS的文件精度是100ns。
由于两种文件系统的文件精度不一样,如果我们把文件从NTFS文件系统拷贝到FAT32文件,由于时间精度不同,文件时间将被强制以偶数对齐。
NTFS 时间: 7 hours 31 min 0 sec 000ms.
FAT 时间为: 7 hours 31 min 0 sec 000ms.
NTFS 时间: 7 hours 31 min 0 sec 001ms.
FAT32 时间为:7 hours 31 min 2 sec 000ms.
NTFS 时间: 7 hours 31 min 1 sec 000ms.
FAT32 时间为:7 hours 31 min 2 sec 000ms.
NTFS 时间:7 hours 31 min 1 sec 999ms.
FAT32 时间为:7 hours 31 min 2 sec 000ms.
从上面的例子我们可以看出NTFS 到 FAT32 ,文件时间最多会相差2秒。
我们在程序中如果要通过文件时间来判断文件是否相同,一定要考虑到两种文件系统的时间误差的问题,否则会导致系统出现错误。另外用MD5 来判断文件是否相同会更好一些,不过对于大文件,MD5的计算时间会比较长。
参考:
【推荐】国内首个AI IDE,深度理解中文开发场景,立即下载体验Trae
【推荐】编程新体验,更懂你的AI,立即体验豆包MarsCode编程助手
【推荐】抖音旗下AI助手豆包,你的智能百科全书,全免费不限次数
【推荐】轻量又高性能的 SSH 工具 IShell:AI 加持,快人一步
· 如何编写易于单元测试的代码
· 10年+ .NET Coder 心语,封装的思维:从隐藏、稳定开始理解其本质意义
· .NET Core 中如何实现缓存的预热?
· 从 HTTP 原因短语缺失研究 HTTP/2 和 HTTP/3 的设计差异
· AI与.NET技术实操系列:向量存储与相似性搜索在 .NET 中的实现
· 周边上新:园子的第一款马克杯温暖上架
· Open-Sora 2.0 重磅开源!
· .NET周刊【3月第1期 2025-03-02】
· 分享 3 个 .NET 开源的文件压缩处理库,助力快速实现文件压缩解压功能!
· [AI/GPT/综述] AI Agent的设计模式综述
2009-10-12 自动生成Insert 语句的小工具