System.IO.Compression Zip不使用UTC

问题描述 投票:1回答:1

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

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

我假设在标准时间或夏令时中压缩的文件存在同样的问题,而在另一个中解压缩。

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

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

除了在Zip和Unzip期间构建我自己的时间转换例程之外,还有什么方法吗?

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

.net visual-studio-2013 zip utc system.io.compression
1个回答
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。)

© www.soinside.com 2019 - 2024. All rights reserved.