System.IO.Compression Zip不使用UTC

时间:2014-09-25 18:21:14

标签: .net visual-studio-2013 zip utc system.io.compression

我刚刚开始在.NET 4.5中使用System.IO.Compression,并发现了一个问题。它使用本地修改时间存储文件,而不是通用UTC时间。

因此,如果您在一个时区中压缩文件并将其解压缩到另一个时区,它会使用原始文件中的本地修改时间(例如下午1点),并使用相同的修改时间(也是下午1点)提取文件,甚至虽然它应该提前几个小时或更晚。

我认为在标准时间或夏令时中拉链的文件会存在同样的问题,而在另一个中解压缩。

在压缩过程中似乎缺少设置,因为其他解压缩方法(WinZip,压缩文件夹提取)会产生相同的错误修改时间。

我已经测试过使用WinZip在不同的时区压缩和解压缩文件,但它没有这个问题。它必须在内部使用UTC进行修改。

除了在Zip和Unzip期间构建我自己的时移例程之外,还有其他方法吗?

此项目无法使用任何外部应用程序或库。我们仅限于使用.NET函数。

1 个答案:

答案 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上为chownchmod。)

相关问题