Как я могу контролировать порядок файлов в ZIP-архиве?

13

Бывают случаи, когда необходимо, чтобы файлы в ZIP-архиве были в определенном порядке (например, в настоящее время я создаю EPUB , которые требуют, чтобы первая запись в ZIP- mimetypeфайле была файлом). Как я могу сделать это на Windows?

В настоящее время я использую 7-Zip в качестве архиватора, но не вижу опции для управления порядком файлов. Можно ли это сделать с помощью 7-zip? Если нет, какие варианты у меня есть?

Бен Бланк
источник
3
Добавление их в том порядке, в котором они должны быть, должно сделать это. Попробуйте сначала сжать файл mimetype, а затем добавить другие файлы в zip как вторую операцию.
Пол
1
@Paul - Удивительно, но это не сработало. : - /
Бен Бланк
Возможно, это LIFO? Можете ли вы попробовать добавить mimetype в последний раз? Вы тестируете против epub reader правильно, а не просто расстегиваете молнию?
Пол
3
Приложение, которое требует, чтобы содержимое было в определенном порядке, не работает.
psusi
3
Боже, авторам спецификации нужно отобрать обратно и избить с подсказкой на четыре.
psusi

Ответы:

3

Один из способов: большинство архиваторов и инструментов архивирования имеют возможность добавлять или добавлять дополнительные элементы файла в исходный архив. Создайте свой архив с элементами, которые вы хотите вверху, затем добавьте дополнительные элементы файлов в этот созданный архив. Я знаю, что это работает в Windows собственные инструменты ZIP.

похоже, что реальный ответ за мной, здесь для C # /programming/5898787/creating-an-epub-file-with-a-zip-library

здесь для HTML (используя 7z)
http://next.blurb.com/2011/02/17/how-to-make-an-ipad-photo-book/

конкретно эта часть

2. Откройте папку sample-photo-book и сначала скопируйте mimetype файла в (пустой) архив.
3. Теперь скопируйте другие папки (META-INF и OEBPS) в архив.


http://idpf.org/epub/30/spec/epub30-ocf.html#physical-container-zip

Содержимое файла mimetype не должно содержать никаких начальных отступов или пробелов, не должно начинаться с подписи Unicode (или метки порядка байтов), а регистр строки типа MIME должен быть точно таким, как представлен выше. Кроме того, файл mimetype не должен быть ни сжатым, ни зашифрованным, и в его заголовке ZIP не должно быть дополнительного поля.

Psycogeek
источник
1
Я попробовал это в 7-zip (создание архива только с mimetypeпоследующим добавлением других файлов), но безуспешно. Эти mimetype данные пришли первые в файле, но файловая таблица , кажется, алфавитной.
Бен Бланк
2
@BenBlank Убедитесь, что вы не проверяете это с помощью zip-клиента - они будут переупорядочены так, как это удобно людям, а не обязательно то, что увидит читатель epub.
Пол
Предположительно проблема в том, что 7-Zip любит поддерживать свой каталог в альфа-порядке, а затем (обязательно) перезаписывает его, когда закрывает zip-файл. Теоретически это можно исправить, отредактировав zip-файл с помощью шестнадцатеричного редактора или какого-то специального инструмента и переставив каталог - это не особенно сложно. Редактирование будет упрощено путем включения фиктивного файла, который всегда сортируется первым. Но тогда, конечно, техника в ссылке выше должна работать тоже.
Даниэль Р Хикс
Я использовал 7z l filename.zipдля перечисления содержимого почтового индекса, и они, кажется, не в каком-либо порядке (имя, путь, дата, размер ...). Таким образом, использование этой командной строки может помочь определить истинный порядок файлов в zip.
Скотт МакКленнинг
@Paul - я проверяю, открывая .epubв текстовом редакторе и непосредственно проверяя таблицу файлов, так что похоже, что этот подход просто не работает для меня. Я собираюсь взять Python молот к проблеме и посмотреть, если это не решит.
Бен Бланк
3

7-zip версия GUI:

  1. извлечь mimetypeиз файла EPUB
  2. удалить mimetypeв файле EPUB
  3. переименовать mimetypeв!mimetype
  4. добавить !mimetypeв EPUB файл
  5. переименовать !mimetypeво mimetypeвнутренний файл EPUB

7-zip простая версия для перетаскивания:

Перейдите на страницу загрузки 7-zip и загрузите 7-Zip Extra: standalone console version, 7z DLL, Plugin for Far Manager(не работает со стабильной 9.20, но хорошо работает с 9.38 бета и 15.06 бета). Extract 7za.exe. Сохраните код ниже как repair.batфайл:

7za x %1 mimetype -y
7za d %1 mimetype
move /y mimetype !mimetype
7za a %1 !mimetype
del /f !mimetype
7za rn %1 !mimetype mimetype

Поместите 7za.exeи repair.batв ту же директорию и просто перетащите свой файл EPUB repair.bat.

Tithen-Firion
источник
2

Создание EPUB требует двухэтапного процесса: сначала добавьте mimetype без какого-либо (!) Сжатия, затем добавьте другие файлы / папки. Таким образом, используя 7z, вы можете взять следующие команды:

7z a -mx=0 dummy.zip mimetype

Чтобы иметь возможность использовать подстановочный знак *, вы должны переместить файл mimetype в другую папку и начать второй шаг:

7z a -r dummy.zip *

После этого переименуйте ZIP в EPUB, и вы ушли!

Питер
источник
Я только что попробовал это, и я все еще получаю эту ошибку:Epubcheck Version 3.0.1 ERROR: C:/MYSELF/Books/1984---George-Orwell/1984---George-Orwell.epub: Mimetype entry missing or not the first in archive
Томаш Зато - Восстановить Монику
1

По моему опыту, самый простой ответ (для Windows, 7, 64-битный) - использовать встроенную Zip-функциональность Window. Используйте команду «Отправить», чтобы отправить mimetype в новую zip-папку, затем используйте 7Zip, чтобы добавить META-INF и OEBPS в новый zip-файл. Это, кажется, всегда работает с точки зрения последовательности файла mimetype в первую очередь. Я не имел успеха, выполняя эту операцию исключительно с 7-почтовым индексом. (Это для ePUBS, но оно должно работать для секвенирования и в других областях.)

Я надеюсь, что это помогает кому-то еще.

Кимберли Хитченс
источник
0

Использование WinRar сделал свое дело для меня. Я добавил mimetype в zip-архив (без сжатия!), А затем добавил остальные папки, обычное сжатие.

Это решение не работало с 7-zip для меня, поскольку оно продолжает переупорядочивать файлы.

Kat
источник
0

У меня была такая же проблема при работе с EPUB-файлами.

В Windows 7 я исправил это с помощью этой странной уловки, где я убедился, что отсортировал все файлы, которые я собирался сделать, в zip-файл таким образом, чтобы сделать mimetype файл сверху (обычно сортируя их по размеру). Затем я удостоверился, что пометил все файлы сверху вниз курсором, прежде чем отправить их в сжатую (zip) папку (например, https://support.microsoft.com/en-us/help/14200/ windows-compress-uncompress-zip-файлы ). После этого я мог изменить имя и тип файла на любой .epub.

Однако после обновления до Windows 10 этот прием больше не работал. К счастью, я нашел другой путь. Сначала вы отправляете нужный файл вверху (mimetype) в zip-файле в сжатую (zip) папку. Убедитесь, что это только тот файл. Затем я беру другие файлы, которые хочу заархивировать (две папки в моем случае), пометить их курсором и перетащить их в созданный мной zip-файл. После этого Windows добавит новые файлы в zip-файл и оставит сверху файл, который вы изначально заархивировали.

MatsKS
источник
1
Можете ли вы четко указать, каков ответ на вопрос автора? Обновление до Windows 10 на самом деле не является ответом на этот вопрос. Вы должны сконцентрироваться на том, как вы это исправили, предоставить конкретику, ваши заявления являются широкими. Если бы я воспроизвел исходную проблему, я не смог бы решить ее с вашим ответом.
Ramhound