![]() |
Архивация содержимого папки по размеру
Доброго времени суток!
Подскажите пожалуйста как при помощи CMD/BAT реализовать следующее: В папке (input) лежат папки и файлы (все время разные по названию и немного отличаются по размеру 5-10КБ), например: images\ files\ rss1.xml robots.txt sitemap.xml sitemap58.php sitemap57.php sitemap56.php sitemap55.php ... art-218011.php Требуется создать архивы по 7,5МБ+-1МБ. Имя архива по названию родительской папки плюс порядковый номер, в итоге должно получиться примерно так: input1.zip (содержит: images\ files\ rss1.xml robots.txt) input2.zip (содержит: sitemap.xml sitemap58.php sitemap57.php) input3.zip (содержит: sitemap56.php sitemap55.php) и т.д. Если реализация по размеру архива 7,5МБ сложна в реализации - вполне подойдет: берем из папки первые (100-200) файлов - пакуем их в input1.zip, следующие (100-200) в input2.zip и так пока не кончатся папки и файлы в папке input. Заранее благодарен! |
irvicon, теоретически, то, что Вы просите, сделать в большинстве случаев возможно, но чересчур накладно. Чем Вас не устраивает обычный многотомный архив, который позволяют создавать и 7-Zip, и WinRAR, в том числе и в формате .zip (правда, каждый по-своему)?
|
Цитата:
Цитата:
|
Вот маразматичное по скорости работы решение
Код:
@Echo Off А если реализовывать второй ваш вариант У rar есть ключ -N@<файл-список>, но почему-то мне в файл-списке не удаётся указывать полные (с путями) имена файлов, получается только для файлов в текущей папке. А реально сделать более эффективно - скопировать исходные файлы порциями в промежуточную папку, и уж её архивировать со своим именем с последующим удалением. |
Цитата:
Я так и вовсе предполагал так же добавлять по одному файлу, а при превышении размера архива выше заданного — ещё и удалять из него последний добавленный файл. |
irvicon, Вы писали: файлы ... немного отличаются по размеру 5-10КБ, при этом размер архивов должны быть по 7,5МБ+-1МБ.
Итак, возмём за основу размер архива, например, 7500 Кб, средний размер файла, например, 10 Кб и, определим опытным путём, процент сжатия файлов архиватором - например, 80%. По видимому, этот процент не сильно меняется для Вашего набора файлов, так как ИМХО, характеристики файлов от случая к случаю не сильно отличаются, скорее всего они создаются одним и тем же софтом для одних и тех же целей. Посчитаем, сколько файлов надо заархивировать, чтобы приблизительно получить архив заданной величины. Куда-нибудь, например, в папку для временных файлов, по очереди будем переписывать исходные файлы вычисленными порциями с сохранением структуры папок, архивировать порцию и затем удалять заархивированную копию. Работает существенно быстрее, чем мой предыдущий вариант, но, естественно, размер архива будет намного сильнее отличаться от заданного. Но, ИМХО, Вам важно не превысить максимально-допустимый размер, что вполне достижимо в приведенном коде.
Код:
@Echo Off |
Цитата:
:cool: :oszone: ...но:
|
В соответствии с Вашим техзаданием
Код:
@Echo Off Здесь вариант с максимальным приближением к архиву заданного размера
Код:
@Echo Off |
Цитата:
те в архиве лишняя вложенность http://c2n.me/3qGOwkC нужно чтобы при распаковке корень последней папки (обведено оранжевой рамкой) |
irvicon, В Вашей постановке задачи
Цитата:
Цитата:
Именно это и делается в моём скрипте: Архив с именем Дата_Games1,2,3 ... содержит папку Сокровища Монтесумы\Data\ с сохранением пути. При этом никакие иные подпапки или файлы в папке Games не затрагиваются. При распаковке, естественно, получится папка с сохранёнными путями Сокровища Монтесумы\Data, при этом никакие иные посторонние подпапки нигде не фигурируют. Что не так? Или Вы хотите, чтобы путь терялся и распаковывалась только самая нижняя из указанных папок Data\ ? |
Цитата:
|
Вот так?
Код:
@Echo Off |
Цитата:
еще ниже = только корень |
Ом мани падме хум :-)
Код:
@Echo Off |
Время: 05:32. |
Время: 05:32.
© OSzone.net 2001-