我刚刚开始在.NET 4.5中使用System.IO.Compression,并发现了一个问题。它以本地修改时间而不是通用UTC时间存储文件。
因此,如果您在一个时区中压缩文件并将其解压缩到另一个时区,它将使用原始文件中的本地修改时间(例如下午1点),并使用相同的修改时间(也是下午1点)提取文件,即使它应该几个小时或更晚。
我假设在标准时间或夏令时中压缩的文件存在同样的问题,而在另一个中解压缩。
在压缩过程中似乎缺少设置,因为其他解压缩方法(WinZip,压缩文件夹提取)会产生相同的错误修改时间。
我已经测试过使用WinZip在不同的时区压缩和解压缩文件,它没有这个问题。它必须在内部使用UTC进行修改。
除了在Zip和Unzip期间构建我自己的时间转换例程之外,还有什么方法吗?
此项目无法使用任何外部应用程序或库。我们仅限于使用.NET函数。
正如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
。)