System.IO.Compression Zip не использует UTC

Я только начал использовать System.IO.Compression в.NET 4.5 и обнаружил проблему. В нем хранятся файлы с локальным временем изменения, а не с универсальным временем UTC.

Таким образом, если вы заархивируете файлы в одном часовом поясе и разархивируете их в другом, он использует локальное время изменения (скажем, 13:00) из исходного файла и извлекает файл с тем же временем изменения (также 1:00), даже если он должен быть часами раньше или позже.

Я предполагаю, что та же самая проблема будет существовать с файлами, заархивированными в Стандартное время или Летнее время, и распакованными позже в другом.

Похоже, что во время архивации отсутствует настройка, так как другие методы разархивирования (WinZip, извлечение сжатой папки) производят такое же неправильное время модификации.

Я протестировал использование WinZip для архивирования и разархивирования файлов в разных часовых поясах, и у него нет этой проблемы. Он должен использовать UTC для изменения времени.

Есть ли способ обойти это, кроме создания моих собственных процедур смены времени во время Zip и Unzip?

Этот проект не может использовать какие-либо внешние приложения или библиотеки. Мы ограничены использованием только функций.NET.

0 ответов

Как упомянул Ханс Пассант в комментарии, в формате zip-файла используется структура даты и времени MS-DOS.

Эта структура определяется как два отдельных 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 предлагает способы добавления расширений. Но я не помню, чтобы они добавляли дату еще. Напоминаю информацию о владении (chown а также chmod на Unix.)

Другие вопросы по тегам