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.)