Форум программистов
 

Восстановите пароль или Зарегистрируйтесь на форуме, о проблемах и с заказом рекламы пишите сюда - alarforum@yandex.ru, проверяйте папку спам!

Вернуться   Форум программистов > Delphi программирование > Общие вопросы Delphi
Регистрация

Восстановить пароль
Повторная активизация e-mail

Купить рекламу на форуме - 42 тыс руб за месяц

Ответ
 
Опции темы Поиск в этой теме
Старый 04.03.2008, 10:59   #1
FaTaL
Участник клуба
 
Аватар для FaTaL
 
Регистрация: 09.11.2007
Сообщений: 1,759
Восклицание Архивация в программе

Хочу в программе организовать архивацию нужных мне файлов в архив *.rar
Как это сделать? Очень было бы удобно использовать и поставлять вместе с своей программой консольную версию rar.exe, но это скорее всего будет нарушение прав автора RAR Александра Рошала или нет? Как быть?
(Нужен формат именно *.rar)
Заранее благодарен за ответы.
P.S. поиск по форуму не дал результатов.
FaTaL вне форума Ответить с цитированием
Старый 04.03.2008, 11:23   #2
Stilet
Белик Виталий :)
Старожил
 
Аватар для Stilet
 
Регистрация: 23.07.2007
Сообщений: 57,792
По умолчанию

Ну в принципе если версия рара старая то врядли это будет проблемой.
Можно конечно использовать другие архиваторы типа arj.
I'm learning to live...
Stilet вне форума Ответить с цитированием
Старый 04.03.2008, 11:26   #3
SunKnight
Участник клуба Подтвердите свой е-майл
 
Аватар для SunKnight
 
Регистрация: 14.12.2007
Сообщений: 1,434
По умолчанию

Создаём собственный UnRar, используя unrar.dll

Цитата:
function RAROpenArchive(ArchiveData : Pointer): Integer; stdcall;
external 'unrar.dll' name 'RAROpenArchive';

function RARCloseArchive(hArcData : Integer): Integer; stdcall;
external 'unrar.dll' name 'RARCloseArchive';

function RARReadHeader(hArcData : Integer; HeaderData : Pointer):
Integer; stdcall;
external 'unrar.dll' name 'RARReadHeader';

function RARProcessFile(hArcData : Integer; Operation : Integer;
DestPath : Pointer; DestName : Pointer): Integer; stdcall;
external 'unrar.dll' name 'RARProcessFile';


const
ERAR_END_ARCHIVE = 10;
ERAR_NO_MEMORY = 11;
ERAR_BAD_DATA = 12;
ERAR_BAD_ARCHIVE = 13;
ERAR_UNKNOWN_FORMAT = 14;
ERAR_EOPEN = 15;
ERAR_ECREATE = 16;
ERAR_ECLOSE = 17;
ERAR_EREAD = 18;
ERAR_EWRITE = 19;
ERAR_SMALL_BUF = 20;

RAR_OM_LIST = 0;
RAR_OM_EXTRACT = 1;
RAR_SKIP = 0;
RAR_TEST = 1;
RAR_EXTRACT = 2;
RAR_VOL_ASK = 0;
RAR_VOL_NOTIFY = 1;

type
Char260 = array [1..260] of Char;

TRAROpenArchiveData = record
ArcName : PChar; // в C++ это будет выглядеть как: char *ArcName
OpenMode : Cardinal;
OpenResult : Cardinal;
CmtBuf : PChar;
CmtBufSize : Cardinal;
CmtSize : Cardinal;
CmtState : Cardinal;
end;

TRARHeaderData = record
ArcName : Char260;
FileName : Char260;
Flags : Cardinal;
PackSize : Cardinal;
UnpSize : Cardinal;
HostOS : Cardinal;
FileCRC : Cardinal;
FileTime : Cardinal;
UnpVer : Cardinal;
Method : Cardinal;
FileAttr : Cardinal;
CmtBuf : PChar;
CmtBufSize : Cardinal;
CmtSize : Cardinal;
CmtState : Cardinal;
end;


var
RARExtract : boolean;
RAROpenArchiveData : TRAROpenArchiveData;
RARComment : array [1..256] of Char;
RARHeaderData : TRARHeaderData;

...

procedure ExtractRARArchive;
var
sDir : string;
s : string;
sTest : string;
iTest : integer;
bTestDone : boolean;
RARhnd : Integer;
RARrc : Integer;
PDestPath : Char260;
begin
RARExtract:=TRUE;
lKBWritten:=0;
ProgressBar2.Position := 0;
ProgressBar2.Max := lTotalSize;
RARStartTime:=Time;

RAROpenArchiveData.OpenResult:=99;
RAROpenArchiveData.OpenMode := RAR_OM_EXTRACT; // открываем для распаковки
RAROpenArchiveData.ArcName:= @RARFileName;
RAROpenArchiveData.CmtBuf := @RARComment;
RAROpenArchiveData.CmtBufSize := 255;

// Открываем RAR архив и выделяем память
RARhnd := RAROpenArchive (@RAROpenArchiveData);
if RAROpenArchiveData.OpenResult <> 0 then
begin
case RAROpenArchiveData.OpenResult of
ERAR_NO_MEMORY : s:='Not enough memory to initialize data structures';
ERAR_BAD_DATA : s:='Archive header broken';
ERAR_BAD_ARCHIVE : s:='File is not valid RAR archive';
ERAR_EOPEN : s:='File open error';
end;
MessageDlg('Unable to open rar archive: ' + s + '!',mtError, [mbOK], 0);
end;

RARSetProcessDataProc(RARhnd,@Form. OnRarStatus);
StrPCopy(@PDestPath, EInstallPath.Text);

repeat
RARrc := RARReadHeader (RARhnd, @RARHeaderData);// Читаем заголовок
if RARrc <> ERAR_END_ARCHIVE then
begin
ProgressBar1.Position := 0;
ProgressBar1.Max := RARHeaderData.UnpSize;
s:=RARHeaderData.FileName;
lblCurrentFile.Caption := s;
lKBytesDone := 0;
end;

if RARrc = 0 then
RARrc:=RARProcessFile (RARhnd, RAR_EXTRACT, @PDestPath, nil);
if (RARrc <> 0) and (RARrc <> ERAR_END_ARCHIVE) then
begin
MessageDlg('An Error occured during extracting of ' + sTest+'!' + #13#10 +
'RARProcessFile: ' + MakeItAString(RARrc),mtError, [mbOK], 0);
end;
until
RARrc <> 0;

// закрываем RAR архив и освобождаем память
if RARCloseArchive(RARhnd) <> 0 then
begin
MessageDlg('Unable to close rar archive!',mtError, [mbOK], 0);
end;
end;
Проповедую design patterns, верую в MVC, доверяю eXtrime programming.
SunKnight вне форума Ответить с цитированием
Старый 04.03.2008, 12:09   #4
mihali4
*
Старожил
 
Регистрация: 22.11.2006
Сообщений: 9,201
По умолчанию

Или еще проще - с использованием библиотечки VCLZip.
mihali4 вне форума Ответить с цитированием
Старый 04.03.2008, 13:47   #5
FaTaL
Участник клуба
 
Аватар для FaTaL
 
Регистрация: 09.11.2007
Сообщений: 1,759
По умолчанию

Цитата:
Сообщение от mihali4 Посмотреть сообщение
Или еще проще - с использованием библиотечки VCLZip.
А VCLZip поддерживает архивацию в формате RAR?

Цитата:
Сообщение от SunKnight
Создаём собственный UnRar, используя unrar.dll
Мне надо не распаковывать, а запаковывать.
FaTaL вне форума Ответить с цитированием
Старый 04.03.2008, 13:59   #6
andrey4623
Форумчанин
 
Аватар для andrey4623
 
Регистрация: 31.05.2007
Сообщений: 266
По умолчанию

консольная версия бесплатна и ее можно использовать вместе со своей программой
andrey4623 вне форума Ответить с цитированием
Старый 04.03.2008, 14:10   #7
mihali4
*
Старожил
 
Регистрация: 22.11.2006
Сообщений: 9,201
По умолчанию

Цитата:
А VCLZip поддерживает архивацию в формате RAR?
Наоборот, RAR знает все, в том числе и ZIP...
А что - это так критично, в каком формате паковать/распаковывать?
mihali4 вне форума Ответить с цитированием
Старый 04.03.2008, 14:49   #8
FaTaL
Участник клуба
 
Аватар для FaTaL
 
Регистрация: 09.11.2007
Сообщений: 1,759
По умолчанию

Цитата:
Сообщение от andrey4623 Посмотреть сообщение
консольная версия бесплатна и ее можно использовать вместе со своей программой
В лицензии WinRAR написано совершенно подругому. Или я не так понял.
FaTaL вне форума Ответить с цитированием
Старый 04.03.2008, 14:58   #9
B_N
Новичок
Джуниор
 
Регистрация: 18.01.2008
Сообщений: 1,720
По умолчанию

Цитата:
Сообщение от FaTaL Посмотреть сообщение
В лицензии WinRAR написано совершенно подругому. Или я не так понял.
Насколько мне известно RAR - закрытый формат, хотя и существуют официальные исходники и библиотеки для распаковки...
B_N вне форума Ответить с цитированием
Старый 04.03.2008, 15:11   #10
JTG
я получил эту роль
Старожил
 
Аватар для JTG
 
Регистрация: 25.05.2007
Сообщений: 3,694
По умолчанию

Без лицензии можно использовать только библиотеку UnRAR.
Может всё-таки можно использовать открытый формат, 7-zip отлично жмёт например?
пыщь
JTG вне форума Ответить с цитированием
Ответ


Купить рекламу на форуме - 42 тыс руб за месяц

Опции темы Поиск в этой теме
Поиск в этой теме:

Расширенный поиск


Похожие темы
Тема Автор Раздел Ответов Последнее сообщение
Архивация БД ADO Alexsandr БД в Delphi 1 07.04.2008 18:42
Архивация БД dron-s БД в Delphi 0 10.03.2008 12:08
Архивация Mitron Общие вопросы Delphi 10 14.02.2008 16:00
Архивация данных ZYRGiX Win Api 6 05.09.2007 20:58