我刚刚开始在.NET 4.5中使用System.IO.Compression,并发现了一个问题。它使用本地修改时间存储文件,而不是通用UTC时间。
因此,如果您在一个时区中压缩文件并将其解压缩到另一个时区,它会使用原始文件中的本地修改时间(例如下午1点),并使用相同的修改时间(也是下午1点)提取文件,甚至虽然它应该提前几个小时或更晚。
我认为在标准时间或夏令时中拉链的文件会存在同样的问题,而在另一个中解压缩。
在压缩过程中似乎缺少设置,因为其他解压缩方法(WinZip,压缩文件夹提取)会产生相同的错误修改时间。
我已经测试过使用WinZip在不同的时区压缩和解压缩文件,但它没有这个问题。它必须在内部使用UTC进行修改。
除了在Zip和Unzip期间构建我自己的时移例程之外,还有其他方法吗?
此项目无法使用任何外部应用程序或库。我们仅限于使用.NET函数。
答案 0 :(得分:0)
正如汉斯·帕桑特(Hans Passant)在评论中提到的那样,该zip文件格式使用了MS-DOS Date & Time结构。
此结构被定义为两个单独的unsigned short
值,如下所示:
wFatDate
The MS-DOS date. The date is a packed value with the following format.
Bits Description
0-4 Day of the month (1–31)
5-8 Month (1 = January, 2 = February, and so on)
9-15 Year offset from 1980 (add 1980 to get actual year)
wFatTime
The MS-DOS time. The time is a packed value with the following format.
Bits Description
0-4 Second divided by 2
5-10 Minute (0–59)
11-15 Hour (0–23 on a 24-hour clock)
在创建MS-DOS时,那些计算机上没有使用时区(但是,自1970年以来,Unix就已经有了时区概念。)使用MS-DOS的人经常在办公室或家里,而没有通过计算机与其他州的人进行交流,更不用说其他国家了。内联网当时也很昂贵。
创建zip文件格式的公司错误地使用了FAT文件系统日期格式,并且卡住了。因此,zip文件是使用本地时间创建的(不是必须的,但至少是预期的行为。)
不过,zip格式提供了添加扩展名的方法。但是我还不记得他们添加了一个日期。我记得有关所有权的信息(在Unix上为chown
和chmod
。)