Как создать zip-файл, совместимый с Windows под Linux

56653
studiohack

Мне нужно сделать zip-файл доступным для всех моих посетителей-пользователей Windows, поэтому я наивно создал zip-файл с помощью команды Unix zip (назовем его madeinlinux.zip).

Он успешно открывается с WinRar или Winzip, но те из моих пользователей, которые используют стандартную обработку файлов zip-файлов Windows, терпят неудачу при попытке распаковать его. (Windows XP)

Я сжал те же данные, используя встроенный механизм почтового индекса Windows, и с точки зрения Linux, я не вижу никакой разницы в типе файла:

$ file madeinlinux.zip : Zip archive data, at least v2.0 to extract $ file madeinwindows.zip : Zip archive data, at least v2.0 to extract 

Это должно быть что-то специфическое для Windows-совместимого zip-файла.

Кто-нибудь знает что?

42
Не могли бы вы создать один из этих ZIP-файлов (с фиктивным содержимым) и поместить его на сервер для загрузки и проверки? Bernhard Hofmann 14 лет назад 1
Это звучит как случай для superuser.com, если он еще существует. 14 лет назад 0
Конечно, Бернхард, вот виновник: http://www.careerjet.co.uk/devel/Services_Careerjet.zip 14 лет назад 1
Единственная машина с Windows, которую мне приходилось тестировать, была Windows 7, и у нее не было проблем с открытием и извлечением файла с помощью проводника. 14 лет назад 0
Град Windows 7! 14 лет назад 0
используйте gzip. afaik .. у него нет проблем с Windows Extractor. 14 лет назад 0
В итоге я использую формат, отличный от zip * (например, 7zip, rar и т. Д.) *, Чтобы пользователи не пытались открыть его с помощью встроенного в него глючного разархивирования. Hi-Angel 8 лет назад 0

8 ответов на вопрос

23
Igor Fobia

Попробуйте с:

zip -9 -y -r -q file.zip folder/ 
  • -9 Указывает на самую медленную скорость сжатия (оптимальное сжатие, игнорирует список суффиксов)
  • -y Храните символические ссылки как таковые в zip-архиве, вместо того, чтобы сжимать и хранить файл, на который ссылается ссылка
  • -r Путешествовать по структуре каталогов рекурсивно
  • -q Бесшумный режим
11
Bruce McLeod

7zip - это инструмент сжатия с открытым исходным кодом, который работает в Linux, FreeBSD, Mac OS X, BeOS, DOS, Amiga и Windows.

Я очень рекомендую его в зависимости от версии Windows.

Поддерживает

упаковка / распаковка: 7z, ZIP, GZIP, BZIP2 и TAR

Распаковка только: ARJ, CAB, CHM, CPIO, DEB, DMG, HFS, ISO, LZH, LZMA, MSI, NSIS, RAR, RPM, UDF, WIM, XAR и Z.

Я рекомендую не использовать еще один сторонний проприетарный инструмент для этой невероятно распространенной утилиты (zip a file), доступной сейчас на всех платформах. Rick O'Shea 7 лет назад 6
8
MSalters

zip -Zустанавливает параметр сжатия. -Z storeявляется наиболее тривиальным, так как не сжимает вообще. Это полезно, когда вы используете zipв качестве альтернативы tarили для устранения неполадок. В этом случае вы должны попытаться проверить, можно ли использовать несжатый архив из Windows. Если это является полезным, вы знаете, что вы должны выбрать опцию сжатия не по умолчанию.

офигенно, я думаю, что алгоритм сжатия тоже доставляет неприятности ... 14 лет назад 0
6
Dan Rosenstark

Единственное, что выглядит актуально, это

-k - Attempt to convert the names and paths to conform to MSDOS, store only the MSDOS attribute (just the user write attribute from UNIX), and mark the entry as made under MSDOS (even though it was not); for compatibility with PKUNZIP under MSDOS which cannot handle certain names such as those with two dots. 

но прочитайте "man zip" в вашей системе, прежде чем идти куда-либо еще ...

Привет. Спасибо за предложение, но эта опция -k забирает меня назад во времени. Он преобразует все имена файлов в 8-символьную версию без версии :( 14 лет назад 0
Да, я помню те дни. Но помогло ли это чтение файла встроенной программой Zip в Windows? 14 лет назад 0
Не знаю Эта проблема с именем файла остановила меня 14 лет назад 0
Я предполагаю, что это сжатие, как говорит MSalters ... 14 лет назад 0
4
Shakus

В дополнение к тому, что предложили другие, важно обратить внимание на имена ваших файлов и каталогов, поскольку Windows не обязательно любит путь и имена файлов Linux. Это иногда также ускользает от них по-разному при архивировании. Примерами являются многочисленные, но наиболее важные точечные файлы (. И ..), файлы только с регистрационными различиями (name.txt и NAME.txt), абсолютные пути к файлам (/tmp/file.txt) . Некоторые другие символы, которые разрешены в именах файлов в Windows, могут вызывать проблемы при использовании Проводника Windows для открытия файлов. В моем случае характер «:» был решающим фактором, но потребовалось много работы, чтобы выяснить это.

Поэтому, прежде чем вы возобновите использование множества параметров, я предлагаю выполнить простую процедуру:

  1. Найдите папку или подайте ваш архив.

  2. запустите: zip -9 -r -k zip-modified-names.zip / path / to / your / folder

  3. обратите внимание на то, что консоль выплевывает. В моем случае ':' в именах файлов были удалены.
  4. Переместите zip-файл на компьютер с Windows и попытайтесь открыть его.

Если это работает, возможно, лучше удалить символы, которые были удалены опцией -k, из имен файлов / каталогов, попробуйте выполнить обычную архивацию. Обратите внимание, что некоторые параметры, такие как -k, имеют побочные эффекты. В этом случае -k противоречит опции -q (для ссылок sym).

Также опция -k может сделать ваши имена файлов нечитаемыми. В моем случае мои файлы были названы на основе времени создания (например, 10: 55: 39.pdf), чтобы упростить поиск нужной записи в архивах, но опция -k изменила ее на 105539.pdf, что нелегко прочитать пользователям. Поэтому я изменил имена на 10_55_39.pdf, который открывается в Windows без использования опции -k, но все еще доступен для чтения.

@ TD.512 Вы заметили, что на вопрос 6 лет все еще нет определенного ответа? Лучше всего добавить еще один ответ, если он, кажется, помогает кому-то, а другие - нет. Hi-Angel 8 лет назад 1
3
Nicholas Hardy

Недавно была похожая проблема с файлами, созданными из сценария Perl. Обнаружено, что собственный Windows zip (только для Windows 7) неправильно обрабатывает пути с косой чертой и отображает пустой zip-файл. Решением было убрать косую черту перед добавлением файлов. Возможно, некоторые версии команд linux zip хранят пути к файлам с косой чертой.

Согласно приложению. Примечания на сайте pkware (http://www.pkware.com/support/zip-app-note/archives): «Имя файла с необязательным относительным путем. Сохраненный путь не должен содержать букву диска или устройства» или косая черта ". EKW 11 лет назад 2
1
luc

Вот скрипт Python, который я использую для архивирования некоторых файлов. Он был протестирован на Ubuntu и Vista. Почтовый индекс, сгенерированный в Ubuntu, открывается вместе с молнией Vista.

Я думаю, что у меня была похожая проблема в прошлом, и это было потому, что формат zip не был ZIP_DEFLATED. Я не уверен. Я проверю это.

Я надеюсь, что это помогает

импортировать zipfile импорт glob, os, sys  Класс ZipArchive:  def zip_it (self, dirName, files): dirNamePrefix = dirName + "/ *" для имени файла в glob.glob (dirNamePrefix): если os.path.isfile (имя файла) и (не self.exclude_svn или (filename.find (". svn \\") == - 1)): напечатать имя файла имя = имя файла [len (self.folder) +1:] self.archive.write (имя файла, имя, zipfile.ZIP_DEFLATED)  def run (self, folder, name, exclude_svn): self.exclude_svn = exclude_svn self.folder = папка self.archive = zipfile.ZipFile (name + ". zip", "w") os.path.walk (self.folder, ZipArchive.zip_it, self) self.archive.close ()  if __name__ == "__main__": if (len (sys.argv) == 1): напечатать "использование zipit папки [имя] [svn: да | нет]" еще: name = sys.argv [1] exclude_svn = False  if (len (sys.argv)> 2): name = sys.argv [2] if (len (sys.argv)> 3): exclude_svn = (sys.argv [3] == "нет")  arch = ZipArchive () arch.run (sys.argv [1], имя, exclude_svn) печать "готово"  
вопрос в том, можно ли его разархивировать с помощью механизма Windows zip? 14 лет назад 0
да. я открыл его с помощью инструмента zip для Vista. Я надеюсь, что это работает и для вас 14 лет назад 0
0
Luis Andrés García

Возможно, проблема в переносе вашего файла из Linux в Windows. Если вы используете FTP, попробуйте установить двоичную передачу (команда bin в Windows, перед переносом ваших файлов из Linux в Windows).