Версия для печати темы
Нажмите сюда для просмотра этой темы в оригинальном формате
Форум программистов > Delphi: WinAPI и системное программирование > работа с архивами


Автор: neweraser 30.6.2008, 11:09
подскажите, как можно, или с чего начать, я даже примерно не знаю, мне надо по нажатию кнопочки разархивировать архив в определенную директорию, например C:\example\

Автор: CodeMonkey 30.6.2008, 12:52
А какой архив-то? Zip, rar, 7z?
В общем случае можно запустить программу-архиватор с нужными параметрами (узнать можно в справке по программе). В каком-то конкретном случае можно воспользоваться депакером в виде DLL или pas-модуля. 

Автор: neweraser 30.6.2008, 13:11
архивы 7z, хотелось бы запускать программу-архиватор, ну там же в справке не написано как это сделать из delphi
хочу сделать просто как бы "оболочку" для диска с софтом, а все программы там в архивах

Автор: ne0n 30.6.2008, 13:28
neweraser, смотри в справке параметры камандной строки

Автор: Snowy 30.6.2008, 13:43
http://www.rg-software.de/

Автор: neweraser 30.6.2008, 13:44
в какой справке? winrar или delphi?  smile не понимаю я...

Автор: ne0n 30.6.2008, 13:52
Цитата(neweraser @  30.6.2008,  13:44 Найти цитируемый пост)
в какой справке? winrar или delphi? 

ну судя по всему и ту и ту справку смотреть придеться)

из хэлпа винрара
Код

WinRAR допускает управление из командной строки. Общий синтаксис командной строки таков:

WinRAR  <команда>  -<ключ1>  -<ключN>  <архив>  <файлы…>  <@файл-список…>  <путь для извлечения\>

команда    Комбинация символов, определяющая действие, которое будет выполнять WinRAR.
ключ    Ключи используются для определения специфических действий, степени сжатия, типа архива и пр.
архив    Имя обрабатываемого архива.
файлы    Имена обрабатываемых файлов.
файл-список    Файлы-списки - это обычные текстовые файлы, содержащие имена файлов для обработки. Каждое имя файла должно быть указано на отдельной строке и начинаться с первой позиции строки. В файл-список допускается помещать комментарии, признак начала комментария - символы //. Например, для архивирования файлов *.txt из папки c:\work\doc, файлов *.bmp из папки c:\work\image и всех файлов из папки c:\work\misc можно создать backup.lst, содержащий следующие строки:c:\work\doc\*.txt    //резервная копия текстовc:\work\image\*.bmp    //резервная копия рисунковc:\work\miscПосле этого для архивирования достаточно будет выполнить команду:winrar a backup @backup.lstВ одной командной строке разрешается указывать как обычные имена или группы файлов для обработки, так и файлы-списки. Если не указаны ни файлы, ни файлы-списки, то подразумевается шаблон *.* (т.е. WinRAR обработает все файлы).
путь для извлечения    Используется только с командами e и x и указывает папку, в которую нужно извлекать файлы. Если эта папка не существует, то она будет создана.
Замечания

а)    Если не указаны ни файлы, ни файл-список, то подразумевается шаблон *.*, т.е. WinRAR обработает все файлы.
б)    Если не указано расширение архива, то WinRAR будет использовать формат архива по умолчанию, выбранный в профиле архивации по умолчанию, но если вы хотите указать тип архива явно, то это можно сделать добавлением к имени архива расширения RAR или ZIP.
в)    Ключи, введённые в командной строке, имеют более высокий приоритет, чем соответствующие установки в диалоге конфигурации, т.е. используются параметры, заданные ключами.

г)    Для команд C, E, S, T, RR, K и X в имени архива допускается использовать шаблоны, поэтому одной командой можно обработать сразу нескольких архивов. Более того, если вместе с этими командами указать ключ -r, то поиск архивов будет вестись и во всех вложенных папках.
д)    Некоторые команды и ключи применимы только к архивам RAR, некоторые — к архивам RAR и ZIP, а некоторые — к архивам всех поддерживаемых форматов. Это зависит от возможностей, заложенных в формат архива.

е)    Команды и ключи не зависят от регистра символов, поэтому вы можете набирать их как строчными, так и прописными буквами.


Код

A    Добавить файлы в архив
C    Добавить архивный комментарий
CH    Изменить параметры архива
CV    Преобразовать архивы
CW    Записать в файл комментарий архива
D    Удалить файлы из архива
E    Извлечь файлы из архива, игнорируя пути
F    Освежить файлы в архиве
I    Найти строку в архивах
K    Заблокировать архив
M    Переместить файлы и папки в архив
R    Восстановить поврежденный архив
RC    Воссоздать недостающие тома
RN    Переименовать файлы в архиве
RR[N]    Добавить информацию для восстановления
RV[N]    Создать тома для восстановления
S[имя]    Преобразовать архив в самораспаковывающийся
S-    Удалить SFX-модуль
T    Протестировать файлы в архиве
U    Обновить файлы в архиве
X    Извлечь файлы из архива с полными путями


просто запускаешь архиватор с параметрами и все!


Автор: CompWorm 30.6.2008, 13:52
если я не ошибаюсь, то винрар работает с 7zip... хотя я не пользуюсь этим форматом.
тогда попробуй так:
Код

var PAT, PATS: string;
var PATA: PAnsiChar;
...
PAT:=ExtractFilePath(Application.ExeName);
PATS:='"C:\Program Files\WinRAR\winrar.exe" x "'+PAT+'TEMP_UPDATE.zip" *.* "'+PAT+'" -y';
PATA:=Pchar(PATS);
WinExec(PATA, SW_SHOWNORMAL);

... вырезка из моей проги. пути, конечно поправь, как тебе удобно, но важно сохранить параметры x и -y . чтобы заменялся существующий файл, если он вдруг есть, и при этом заменялся без лишних вопросов.
подробней можно прочесть в справке вин-рара по командной строке.
с rar и zip у меня работает на ура.  smile 

Автор: CodeMonkey 30.6.2008, 13:59
Как запустить другую программу - см. например:
http://forum.vingrad.ru/faq/topic-156273.html
http://forum.vingrad.ru/forum/topic-100941/index.html
http://forum.vingrad.ru/forum/topic-203947/index.html
http://forum.vingrad.ru/forum/topic-217054/index.html

TSevenZipVCL - это оболочка к DLL-ке от 7zip. Т.е. при его использовании нужно будет таскать с приложением DLL-библиотеку. Я бы рекомендовал использовать его.

Добавлено через 8 минут и 29 секунд
Цитата(CompWorm @  30.6.2008,  13:52 Найти цитируемый пост)
если я не ошибаюсь, то винрар работает с 7zip...

Если запускать WinRar.exe - то он распакует 7z архив. 
Если же использовать решение, оперирующее unrar.dll, то распаковать 7z архив таким способом не удасться.

Автор: neweraser 30.6.2008, 14:17
Тогда, думаю лучше использовать сам winrar, 
CompWorm, напиши пожалуйста комментарии к коду, что-то ничего не могу понять, вроде все просто, только вот за что отвечают x и у?

Автор: Snowy 30.6.2008, 14:23
Вы не путайте винрар и 7zip
Да, сам винрар поддерживает данный формат.
Но из коммандной строки работать с ним не будет.
Для распаковки существуют dll, как для винрара, так и для 7zip'a
Я дал уже линку на компонент, который работает с dll севензипа.
Есть аналогичный и для винрара, но только для распаковки.
Автор спрашивал про 7Zip - я дал линку на враппер к 7Zip.
А делать через консоль - не лучший вариант.
Оболочка, которая вызывает консоль для распаковки, выглядит ну никак не впечатляюще.

Автор: CodeMonkey 30.6.2008, 14:26
Цитата(neweraser @  30.6.2008,  14:17 Найти цитируемый пост)
Тогда, думаю лучше использовать сам winrar

Скажите, а какие есть причины использовать WinRAR для распаковки архивов 7zip? Почему бы для распаковки не использовать родной архиватор. Вы хотите воспользоваться тем, что WinRAR уже стоит на многих машинах?

Цитата(neweraser @  30.6.2008,  14:17 Найти цитируемый пост)
только вот за что отвечают x и у

Посмотрите выше, вам ne0n привёл вырезку из справки WinRAR, где объяснено, что такое x. y - это "отвечать "Да" на все запросы".

Добавлено через 1 минуту и 12 секунд
Цитата(Snowy @  30.6.2008,  14:23 Найти цитируемый пост)
Но из коммандной строки работать с ним не будет

Здесь ошибка: он будет работать.

Автор: Snowy 30.6.2008, 14:34
Использовать для распаковки 7Zip WinRar - бред.
Вместо связки программа - враппер - 7Zip.dll
использовать связку программа - запуск винрара - враппер - 7Zip.dll
Ну и нафига тут винрар?
Он сам не распаковывает - для этого ему нужна та же самая 7Zip.dll
Логику чувствуете?

Автор: CodeMonkey 30.6.2008, 14:48
Цитата(Snowy @  30.6.2008,  14:34 Найти цитируемый пост)
Использовать для распаковки 7Zip WinRar - бред

P.S. Лично я с вами согласен.

Автор: neweraser 30.6.2008, 14:53
что-то я совсем запутался, так что лучше использовать? скачал SevenZipVCL, тоже не понимаю ничего  smile 

Автор: Snowy 30.6.2008, 15:00
1. Установи компонент.
2. Скомпилируй пример, который идёт в комплекте.
3. Посмотри, как сделано там и сделай аналогично в своей программе.
4. Не забывай, что для работы, 7za.dll должна лежать рядом с твоей программой.

Автор: neweraser 1.7.2008, 08:34
я не то что откомпиллировать не могу - даже открыть, пишет что не может найти файл SevenZipDemo.res.  Recreated

Автор: CodeMonkey 1.7.2008, 09:40
Цитата(neweraser @  1.7.2008,  08:34 Найти цитируемый пост)
даже открыть, пишет что не может найти файл SevenZipDemo.res.  Recreated

Вообще-то это не проблема. Просто для уменьшения размера архива в него не включены res-файлы. Среда вас уведомила о том, что их нет и она их пересоздала пустыми. Нужно просто сохраниться и откомпилироваться.

Автор: neweraser 1.7.2008, 12:45
все равно не получается, потом пишет "class TSevenZip not found"  smile 

Автор: CodeMonkey 1.7.2008, 13:06
А кто будет устанавливать компонент?
http://www.google.com/search?&q=%D0%BA%D0%B0%D0%BA+%D1%83%D1%81%D1%82%D0%B0%D0%BD%D0%BE%D0%B2%D0%B8%D1%82%D1%8C+%D0%BA%D0%BE%D0%BC%D0%BF%D0%BE%D0%BD%D0%B5%D0%BD%D1%82+Delphi

Была же пошаговая инструкция:
Цитата(Snowy @  30.6.2008,  15:00 Найти цитируемый пост)
1. Установи компонент.
2. Скомпилируй пример, который идёт в комплекте.
3. Посмотри, как сделано там и сделай аналогично в своей программе.
4. Не забывай, что для работы, 7za.dll должна лежать рядом с твоей программой.

Автор: neweraser 1.7.2008, 13:38
спасибо! все получилось, буду дальше разбираться

Автор: Juice 11.12.2008, 03:39
Всё-таки проще было таскать с собой 7z.dll и 7z.exe - всего лишь 700К. Нужно-то только вызвать 7z e -o ...
P.S. Зато научился компоненты ставить smile

Powered by Invision Power Board (http://www.invisionboard.com)
© Invision Power Services (http://www.invisionpower.com)