У меня есть командный файл, который переименовывает файлы.
Можно ли переименовать файлы в ZIP-файле? Если нет, возможно ли их "извлечь" в фоновом режиме, переименовать и "добавить" обратно в тот же ZIP-архив?
У меня есть командный файл, который переименовывает файлы.
Можно ли переименовать файлы в ZIP-файле? Если нет, возможно ли их "извлечь" в фоновом режиме, переименовать и "добавить" обратно в тот же ZIP-архив?
В формате Zip хранятся метаданные и данные отдельно для каждой записи. Таким образом, это позволит вам перебирать записи и изменять имя записи на лету, не распаковывая / сжимая данные, с эффективностью потоковой передачи, памяти и диска.
Я не знаю инструмента, предлагающего его из коробки, поэтому вам придется использовать библиотеку, такую как libzip, и связать ее с вашим любимым языком.
Поэтому, если ваши zip-архивы маленькие, и вы не выполняете эту задачу снова и снова, вам следует придерживаться процесса извлечения / переименования / архивирования.
Уже немного поздно, но так как это сработало для меня, я поделюсь своими выводами из:
http://www.info-zip.org/FAQ.html#rename
В основном вы должны использовать утилиту zipnote.
Example:
zipnote foo.zip > foo.tmp
ed foo.tmp
... then you edit the comments, save, and exit ...
zipnote -w foo.zip < foo.tmp
"@ name" can be followed by an "@=newname" line to change the name
Он по-прежнему будет перезаписывать весь файл, но на один шаг меньше, чем извлечь файл, переименовать, удалить файл из zip, добавить переименованный файл обратно.
Вы можете извлечь -> переименовать -> сжать, как предложено выше, или вы можете отредактировать шестнадцатеричные данные почтового индекса, чтобы изменить имена внутри файла
Пример:eg1
Очевидно, что это намного сложнее сделать с пакетной обработкой, чем с извлечением, переименованием и сжатием, но если вы должны переименовать его, пока он еще находится в zip-архиве, это возможно, поскольку фактическое имя файла существует в .zip, Вы также можете преобразовать исходное имя в шестнадцатеричное, найти этот шестнадцатеричный массив в файле и заменить его новым.
Вы можете использовать версию 7-zip для командной строки
Например:
7z e archive.zip -o C:\Temporary\Dir
ren C:\Temporary\Dir\*.* *.renamed
7z a archive.zip C:\Temporary\Dir\* -aoa -y -sdel
e
обозначает Extract, -o
- выходной каталог.
Затем вы ren
файлы внутри (используя все, что у вас есть в вашем пакетном скрипте на данный момент).
Наконец, мы a
дд *
(все) файлы из C:\Temporary\Dir
обратно в тот же archive.zip
но так как они существуют, мы хотели бы переписать все -aoa
и убедитесь , что мы согласны -y
в любые подсказки (в случае, если они появляются).
Да, и потому что нам нравится делать его чистым, -sdel
гарантирует, что все файлы, которые были добавлены в архив, удалены.