7-Zip много файлов из разных папок?

4495
mafu

Я хотел бы добавить большое количество файлов с разными именами из разных папок в один 7-Zip архив с помощью 7za.exe. Это должно быть просто, но это оказалось большой болью.

Я создал файл, который содержит paths ( 7za a out.7z @list.txt), но если их слишком много (~ 100), происходит сбой. По-видимому, содержимое файла аргумента помещается в буфер командной строки [ Редактировать : это, скорее всего, была дезинформация с моей стороны, в любом случае это была не причина ], что слишком мало (количество добавляемых файлов превышает один миллион).

Разделение процесса путем добавления файлов по одному невозможно из-за способа 7zaработы: при добавлении следующего файла он создает копию архива, добавляет файл в копию и, наконец, заменяет оригинал. Это ужасно медленно, когда размер архива достигает пары 100 МБ.

Пока что я использую комбинацию двух подходов, добавляя дюжину файлов каждый раз в цикле, но это ненадежный взлом и все еще очень медленный. Есть ли лучший способ сделать это?

Я пытался использовать DLL-библиотеки оболочки 7-Zip (я программист на C #), но ни одна из них не работала надежно, и мне неоднократно предлагалось просто использовать 7zaвместо этого.

4
'-a помещаются в буфер командной строки' .. Я склонен не верить, что это утверждение является поддельным. тем более что в коде используется функция `ReadNamesFromListFile ()` из файла `ListFileUtils.cpp`. флаг '-a' вообще не существует, командная строка должна выглядеть больше как `7za a out.7z @ in.txt` akira 12 лет назад 0
Я создал 50 папок со 100 (пустыми) текстовыми файлами в каждой. построить список файлов. скормил этот список в `7za`. работал как шарм. предоставить дополнительную информацию о том, как вы создаете список файлов, как они организованы (по пути), где находится ваш рабочий каталог и т. д. и т. д. akira 12 лет назад 0
Не могли бы вы выполнить команду, чтобы скопировать все эти файлы в новую папку, затем сжать ее, или вам нужно сохранить структуру файлов? SaintWacko 12 лет назад 0
@akira: Да, моя ошибка, я обновил текст вопроса. mafu 12 лет назад 0
@akira: Не могли бы вы попробовать это с еще большим количеством файлов и более длинными патчами? Я использую команду `7za / 7za.exe a" C: \ foo / 0000.7z "-mx1 -w" C: \ foo / "-" C: \ temp \ list.tmp "`. Рабочий каталог - c: \ input, и все пути в list.tmp находятся в этом каталоге. (Реальные имена каталогов длиннее и глубже.) mafu 12 лет назад 0
@SaintWacko: Хорошая идея. Структура каталогов должна быть сохранена, но, так как я все равно обрезаю начало пути, я могу также воссоздать хвост структуры каталогов и скопировать файлы, а затем просто передать весь каталог в 7za. Недостатком было бы то, что это один дополнительный шаг копирования миллионов файлов, но я думаю, что я могу с этим смириться. Гораздо лучше, чем копировать архивный файл 7z тысячи раз. mafu 12 лет назад 0
@mafutrct: как долго, как глубоко? каковы ваши самые длинные имена путей? в зависимости от того, как написан 7za и какой API он использует, может возникнуть проблема с «слишком длинными» путями. akira 12 лет назад 0
@akira: Я не уверен, я проверю это. Тем не менее, я точно знаю, что все работает, когда я неоднократно кормлю меньшие списки 7za. При больших списках он всегда задыхается в одно и то же время (т. Е. При повторном запуске с тем же списком он останавливается на том же файле, хотя путь к файлу не является необычным в любом случае). mafu 12 лет назад 0
@akira: Длина рабочего каталога и пути exe - 92, самый длинный путь в файле списка - 168, из которых 29 - корневая папка архива. Путь к целевому zip-файлу равен 56. Общая команда для одного файла будет иметь длину 693 (и работает для меня). mafu 12 лет назад 0
@mafutrct - это решит вашу проблему? Должен ли я записать это как ответ? SaintWacko 12 лет назад 0
@mafutrct: 7za использует unicode-api на win32, поэтому он обрабатывает до 32 тыс. символов в пути. происходит сбой 7za после n-й записи в списке? просто кончается нормально? какой код выхода? что говорит вам отладчик (windbg)? всегда ли одна и та же запись в списке останавливает 7za? почему вы хотите нам 7за? только для сжатия? akira 12 лет назад 0
@ SaintWacko: Да, пожалуйста, это эффективный обходной путь. mafu 12 лет назад 0
@akira: Я вернусь с дополнительной информацией в ближайшее время. Да, это всегда одна и та же запись. Я использую его как для сжатия, так и для сбора нескольких файлов в один файл. mafu 12 лет назад 0

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

4
mafu

Из-за глупого подхода к проблеме мне потребовалось много времени, чтобы выяснить настоящую причину. Это связано с ошибкой в 7zip в месте, о котором я не думал.

При использовании списка файлов в Cli версии 4.57 появляется неправильное уведомление об ошибке. Если файл списка содержит несколько строк абсолютных путей (кажется, что работают относительные пути), которые указывают на файлы с одинаковыми именами в разных каталогах, появляется ошибка «Duplicate filename».

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

В исходном вопросе при добавлении только 1 или нескольких файлов за раз это работало (сам файл архива был создан без проблем), поскольку файл списка (случайно) не содержал таких «повторяющихся имен файлов».

Официально это называется фича. Хотя я не уверен в этом, это без сомнения сбило меня с толку из-за отсутствия документов.

Итак, дедупликация списка фактически решает проблему? akira 12 лет назад 0
О, это имело бы смысл, на самом деле. 7zip на самом деле не хранит путь к файлу, как вы думаете об этом. Он просто хранит файлы, а где-то еще отслеживает путь для каждого файла. Это означает, что если у вас есть два файла с одинаковыми именами, даже если они имеют разные пути, он все равно увидит, что пытается поместить два одинаковых файла в архив. SaintWacko 12 лет назад 0
@akira: Да, это так - «дубликаты» файлов нужно добавлять по одному. mafu 12 лет назад 0
@SaintWacko: для пояснения, в данном случае 7z сохраняет путь к файлу в архиве. Вот почему можно добавлять файлы с одинаковыми именами, один за другим. В списке файлов, однако, он проверяет только имена, а не патчи, и, следовательно, не удается. mafu 12 лет назад 0
@mafutrct - О, правда? Мой плохой, я, должно быть, что-то неправильно понял. Спасибо, что выправил меня :) SaintWacko 12 лет назад 0

Похожие вопросы