Bonjour,
J'aimerais savoir combien de fichiers sont compris dans une archive au
format rar. Connaissez-vous une façon simple de le faire en C ou C++ ?
J'ai téléchargé l'api "unrar" chez www.rarlab.com mais il n'y a pas de
documentation fournie.
Bonjour,
J'aimerais savoir combien de fichiers sont compris dans une archive au
format rar. Connaissez-vous une façon simple de le faire en C ou C++ ?
J'ai téléchargé l'api "unrar" chez www.rarlab.com mais il n'y a pas de
documentation fournie.
Bonjour,
J'aimerais savoir combien de fichiers sont compris dans une archive au
format rar. Connaissez-vous une façon simple de le faire en C ou C++ ?
J'ai téléchargé l'api "unrar" chez www.rarlab.com mais il n'y a pas de
documentation fournie.
J'aimerais savoir combien de fichiers sont compris dans une archive au
format rar. Connaissez-vous une façon simple de le faire en C ou C++ ?
J'ai téléchargé l'api "unrar" chez www.rarlab.com mais il n'y a pas de
documentation fournie.
J'aimerais savoir combien de fichiers sont compris dans une archive au
format rar. Connaissez-vous une façon simple de le faire en C ou C++ ?
J'ai téléchargé l'api "unrar" chez www.rarlab.com mais il n'y a pas de
documentation fournie.
J'aimerais savoir combien de fichiers sont compris dans une archive au
format rar. Connaissez-vous une façon simple de le faire en C ou C++ ?
J'ai téléchargé l'api "unrar" chez www.rarlab.com mais il n'y a pas de
documentation fournie.
Bonjour,
J'aimerais savoir combien de fichiers sont compris dans une archive au
format rar. Connaissez-vous une façon simple de le faire en C ou C++ ?
J'ai téléchargé l'api "unrar" chez www.rarlab.com mais il n'y a pas de
documentation fournie.
Bonjour,
J'aimerais savoir combien de fichiers sont compris dans une archive au
format rar. Connaissez-vous une façon simple de le faire en C ou C++ ?
J'ai téléchargé l'api "unrar" chez www.rarlab.com mais il n'y a pas de
documentation fournie.
Bonjour,
J'aimerais savoir combien de fichiers sont compris dans une archive au
format rar. Connaissez-vous une façon simple de le faire en C ou C++ ?
J'ai téléchargé l'api "unrar" chez www.rarlab.com mais il n'y a pas de
documentation fournie.
"Jean-Yves" a écrit dans le message de
news:cpv5lk$cld$
> Bonjour,
>
> J'aimerais savoir combien de fichiers sont compris dans une archive au
> format rar. Connaissez-vous une façon simple de le faire en C ou C++ ?
> J'ai téléchargé l'api "unrar" chez www.rarlab.com mais il n'y a pas de
> documentation fournie.
jai un exemple d'utilisation de la dll en delphi, je le post ici (ca pas
compliqué a convertir en c++)
desolé pour l'indentation, mais ca la perdu en collant
------------------------ fichier
unrar.pas -------------------------------------
unit unrar;
interface
uses Windows;
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
RARHeaderData=record
ArcName :array [0..259] of char;
FileName :array [0..259] of char;
Flags,
PackSize,
UnpSize,
HostOS,
FileCRC,
FileTime,
UnpVer,
Method,
FileAttr: UINT;
CmtBuf:PChar;
CmtBufSize,
CmtSize,
CmtState: UINT;
end;
RAROpenArchiveData=record
ArcName :PChar;
OpenMode :UINT;
OpenResult:UINT ;
CmtBuf :PChar;
CmtBufSize:UINT;
CmtSize :UINT;
CmtState :UINT;
end;
TChangeVolProc =function(ArcName:PChar;Mode:integer):integer cdecl export;
TProcessDataProc=function(Addr:PUCHAR;Size:integer):integer cdecl export;
function RAROpenArchive(var ArchiveDate:RAROpenArchiveData):THandle;
pascal; external 'unrar.dll';
function RARCloseArchive(hArcData : THandle):integer;
stdcall; external 'unrar.dll';
function RARReadHeader(hArcData:THandle;var
HeaderData:RARHeaderData):integer;
stdcall; external 'unrar.dll';
function
nteger;
stdcall; external 'unrar.dll';
procedure
RARSetChangeVolProc(hArcData:THandle;ChangeVolProc:TChangeVolProc);
stdcall; external 'unrar.dll';
procedure
RARSetProcessDataProc(hArcData:THandle;ProcessDataProc:TProcessDataProc);
stdcall; external 'unrar.dll';
procedure RARSetPassword(hArcData:THandle;Password:PChar);
stdcall; external 'unrar.dll';
implementation
end.
--------------------------------------------------------------------------
-------------------------------------
----------------------------------------- fichier 2 -----------------
program UnRdllp;
uses Windows,Unrar;
const
EXTRACT = 0;
TEST = 1;
PRINT = 2;
procedure ShowComment(CmtBuf : PChar);
begin
writeln(#13#10'Comment:'#13#10,CmtBuf,#13#10);
end;
procedure OutHelp;
begin
write(#13#10'UNRDLL. This is a simple example of UNRAR.DLL usage'#13#10);
write(#13#10'Syntax:'#13#10);
write(#13#10'UNRDLL X <Archive> extract archive contents');
write(#13#10'UNRDLL T <Archive> test archive contents');
write(#13#10'UNRDLL P <Archive> print archive contents to stdout');
write(#13#10'UNRDLL L <Archive> view archive contents'#13#10);
end;
function ChangeVolProc(ArcName:PChar;Mode:integer):integer; cdecl export;
var
Ch: char;
begin
result:=1;
if (Mode = RAR_VOL_ASK) then begin
write(#13#10'Insert disk with ',ArcName,' and press ''Enter'' or enter
to exit ');
Readln(Ch);
Result:= Integer(UpCase(Ch)<>'Q');
end;
end;
function ProcessDataProc(Addr:PUCHAR;Size:integer):integer; cdecl export;
var res:DWORD;
begin
Flush(Output);
WriteFile(GetStdHandle(STD_OUTPUT_HANDLE),Addr,Size,Res,nil);
Flush(Output);
result:=1;
end;
procedure OutOpenArchiveError(Error:integer; ArcName:PChar);
begin
case Error of
ERAR_NO_MEMORY: write(#13#10'Not enough memory');
ERAR_EOPEN: write(#13#10'Cannot open ',ArcName);
ERAR_BAD_ARCHIVE:write(#13#10,ArcName,' is not RAR archive');
ERAR_BAD_DATA: write(#13#10,ArcName,': archive header broken');
end;
end;
procedure OutProcessFileError(Error:integer);
begin
case Error of
ERAR_UNKNOWN_FORMAT:write('Unknown archive format');
ERAR_BAD_ARCHIVE: write('Bad volume');
ERAR_ECREATE: write('File create error');
ERAR_EOPEN: write('Volume open error');
ERAR_ECLOSE: write('File close error');
ERAR_EREAD: write('Read error');
ERAR_EWRITE: write('Write error');
ERAR_BAD_DATA: write('CRC error');
end;
end;
procedure ListArchive(ArcName : PChar);
var
hArcData:THandle;
RHCode,PFCode:integer;
CmtBuf:array [0..16383] of char;
HeaderData: RARHeaderData;
OpenArchiveData:RAROpenArchiveData;
begin
OpenArchiveData.ArcName:=ArcName;
OpenArchiveData.CmtBuf:=CmtBuf;
OpenArchiveData.CmtBufSize:=sizeof(CmtBuf);
OpenArchiveData.OpenMode:=RAR_OM_LIST;
hArcData:=RAROpenArchive(OpenArchiveData);
if (OpenArchiveData.OpenResult <> 0) then begin
OutOpenArchiveError(OpenArchiveData.OpenResult,ArcName);
Exit;
end;
if (OpenArchiveData.CmtState = 1) then ShowComment(CmtBuf);
RARSetChangeVolProc(hArcData,ChangeVolProc);
HeaderData.CmtBuf:=CmtBuf;
HeaderData.CmtBufSize:=sizeof(CmtBuf);
write(#13#10'File Size');
write(#13#10'-------------------------------');
RHCode:=RARReadHeader(hArcData, HeaderData);
while (RHCode = 0) do begin
write(#13#10,HeaderData.FileName,' ',HeaderData.UnpSize,' ');
if (HeaderData.CmtState = 1) then ShowComment(CmtBuf);
PFCode:=RARProcessFile(hArcData,RAR_SKIP,nil,nil);
if (PFCode<>0) then begin
OutProcessFileError(PFCode);
break;
end;
RHCode:=RARReadHeader(hArcData, HeaderData)
end;
if (RHCode = ERAR_BAD_DATA) then write(#13#10'File header broken');
RARCloseArchive(hArcData);
end;
procedure ExtractArchive(ArcName:PChar;Mode:integer);
var
hArcData:THandle;
RHCode,PFCode :integer;
CmtBuf:array [0..16383] of char;
HeaderData: RARHeaderData;
OpenArchiveData: RAROpenArchiveData;
begin
OpenArchiveData.ArcName:=ArcName;
OpenArchiveData.CmtBuf:=CmtBuf;
OpenArchiveData.CmtBufSize:=sizeof(CmtBuf);
OpenArchiveData.OpenMode:=RAR_OM_EXTRACT;
hArcData:=RAROpenArchive(OpenArchiveData);
if (OpenArchiveData.OpenResult<>0) then begin
OutOpenArchiveError(OpenArchiveData.OpenResult,ArcName);
exit;
end;
if (OpenArchiveData.CmtState = 1) then
ShowComment(CmtBuf);
RARSetChangeVolProc(hArcData,ChangeVolProc);
if (Mode = PRINT) then
RARSetProcessDataProc(hArcData,ProcessDataProc);
HeaderData.CmtBuf:=nil;
RHCode:=RARReadHeader(hArcData,HeaderData);
while (RHCode = 0) do begin
case (Mode) of
EXTRACT: write(#13#10'Extracting ',HeaderData.FileName:45);
TEST: write(#13#10'Testing ',HeaderData.FileName:45);
PRINT: writeln(#13#10'Printing ',HeaderData.FileName:45);
end;
if (Mode = EXTRACT) then
PFCode:=RARProcessFile(hArcData,RAR_EXTRACT,nil,nil)
else
PFCode:=RARProcessFile(hArcData,RAR_TEST,nil,nil);
if (PFCode <> 0) then begin
OutProcessFileError(PFCode);
break;
end;
write('ok');
RHCode:=RARReadHeader(hArcData,HeaderData);
end; // while
if (RHCode = ERAR_BAD_DATA) then write(#13#10'File header broken');
RARCloseArchive(hArcData);
end;
begin
if (ParamCount<2) then
OutHelp
else
case UpCase(ParamStr(1)[1]) of
'X':ExtractArchive(PChar(ParamStr(2)),EXTRACT);
'T':ExtractArchive(PChar(ParamStr(2)),TEST);
'P':ExtractArchive(PChar(ParamStr(2)),PRINT);
'L':ListArchive(PChar(ParamStr(2)));
else
OutHelp
end;
end.
"Jean-Yves" <jean-yves@no-spam.invalid> a écrit dans le message de
news:cpv5lk$cld$1@s5.feed.news.oleane.net...
> Bonjour,
>
> J'aimerais savoir combien de fichiers sont compris dans une archive au
> format rar. Connaissez-vous une façon simple de le faire en C ou C++ ?
> J'ai téléchargé l'api "unrar" chez www.rarlab.com mais il n'y a pas de
> documentation fournie.
jai un exemple d'utilisation de la dll en delphi, je le post ici (ca pas
compliqué a convertir en c++)
desolé pour l'indentation, mais ca la perdu en collant
------------------------ fichier
unrar.pas -------------------------------------
unit unrar;
interface
uses Windows;
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
RARHeaderData=record
ArcName :array [0..259] of char;
FileName :array [0..259] of char;
Flags,
PackSize,
UnpSize,
HostOS,
FileCRC,
FileTime,
UnpVer,
Method,
FileAttr: UINT;
CmtBuf:PChar;
CmtBufSize,
CmtSize,
CmtState: UINT;
end;
RAROpenArchiveData=record
ArcName :PChar;
OpenMode :UINT;
OpenResult:UINT ;
CmtBuf :PChar;
CmtBufSize:UINT;
CmtSize :UINT;
CmtState :UINT;
end;
TChangeVolProc =function(ArcName:PChar;Mode:integer):integer cdecl export;
TProcessDataProc=function(Addr:PUCHAR;Size:integer):integer cdecl export;
function RAROpenArchive(var ArchiveDate:RAROpenArchiveData):THandle;
pascal; external 'unrar.dll';
function RARCloseArchive(hArcData : THandle):integer;
stdcall; external 'unrar.dll';
function RARReadHeader(hArcData:THandle;var
HeaderData:RARHeaderData):integer;
stdcall; external 'unrar.dll';
function
nteger;
stdcall; external 'unrar.dll';
procedure
RARSetChangeVolProc(hArcData:THandle;ChangeVolProc:TChangeVolProc);
stdcall; external 'unrar.dll';
procedure
RARSetProcessDataProc(hArcData:THandle;ProcessDataProc:TProcessDataProc);
stdcall; external 'unrar.dll';
procedure RARSetPassword(hArcData:THandle;Password:PChar);
stdcall; external 'unrar.dll';
implementation
end.
--------------------------------------------------------------------------
-------------------------------------
----------------------------------------- fichier 2 -----------------
program UnRdllp;
uses Windows,Unrar;
const
EXTRACT = 0;
TEST = 1;
PRINT = 2;
procedure ShowComment(CmtBuf : PChar);
begin
writeln(#13#10'Comment:'#13#10,CmtBuf,#13#10);
end;
procedure OutHelp;
begin
write(#13#10'UNRDLL. This is a simple example of UNRAR.DLL usage'#13#10);
write(#13#10'Syntax:'#13#10);
write(#13#10'UNRDLL X <Archive> extract archive contents');
write(#13#10'UNRDLL T <Archive> test archive contents');
write(#13#10'UNRDLL P <Archive> print archive contents to stdout');
write(#13#10'UNRDLL L <Archive> view archive contents'#13#10);
end;
function ChangeVolProc(ArcName:PChar;Mode:integer):integer; cdecl export;
var
Ch: char;
begin
result:=1;
if (Mode = RAR_VOL_ASK) then begin
write(#13#10'Insert disk with ',ArcName,' and press ''Enter'' or enter
to exit ');
Readln(Ch);
Result:= Integer(UpCase(Ch)<>'Q');
end;
end;
function ProcessDataProc(Addr:PUCHAR;Size:integer):integer; cdecl export;
var res:DWORD;
begin
Flush(Output);
WriteFile(GetStdHandle(STD_OUTPUT_HANDLE),Addr,Size,Res,nil);
Flush(Output);
result:=1;
end;
procedure OutOpenArchiveError(Error:integer; ArcName:PChar);
begin
case Error of
ERAR_NO_MEMORY: write(#13#10'Not enough memory');
ERAR_EOPEN: write(#13#10'Cannot open ',ArcName);
ERAR_BAD_ARCHIVE:write(#13#10,ArcName,' is not RAR archive');
ERAR_BAD_DATA: write(#13#10,ArcName,': archive header broken');
end;
end;
procedure OutProcessFileError(Error:integer);
begin
case Error of
ERAR_UNKNOWN_FORMAT:write('Unknown archive format');
ERAR_BAD_ARCHIVE: write('Bad volume');
ERAR_ECREATE: write('File create error');
ERAR_EOPEN: write('Volume open error');
ERAR_ECLOSE: write('File close error');
ERAR_EREAD: write('Read error');
ERAR_EWRITE: write('Write error');
ERAR_BAD_DATA: write('CRC error');
end;
end;
procedure ListArchive(ArcName : PChar);
var
hArcData:THandle;
RHCode,PFCode:integer;
CmtBuf:array [0..16383] of char;
HeaderData: RARHeaderData;
OpenArchiveData:RAROpenArchiveData;
begin
OpenArchiveData.ArcName:=ArcName;
OpenArchiveData.CmtBuf:=CmtBuf;
OpenArchiveData.CmtBufSize:=sizeof(CmtBuf);
OpenArchiveData.OpenMode:=RAR_OM_LIST;
hArcData:=RAROpenArchive(OpenArchiveData);
if (OpenArchiveData.OpenResult <> 0) then begin
OutOpenArchiveError(OpenArchiveData.OpenResult,ArcName);
Exit;
end;
if (OpenArchiveData.CmtState = 1) then ShowComment(CmtBuf);
RARSetChangeVolProc(hArcData,ChangeVolProc);
HeaderData.CmtBuf:=CmtBuf;
HeaderData.CmtBufSize:=sizeof(CmtBuf);
write(#13#10'File Size');
write(#13#10'-------------------------------');
RHCode:=RARReadHeader(hArcData, HeaderData);
while (RHCode = 0) do begin
write(#13#10,HeaderData.FileName,' ',HeaderData.UnpSize,' ');
if (HeaderData.CmtState = 1) then ShowComment(CmtBuf);
PFCode:=RARProcessFile(hArcData,RAR_SKIP,nil,nil);
if (PFCode<>0) then begin
OutProcessFileError(PFCode);
break;
end;
RHCode:=RARReadHeader(hArcData, HeaderData)
end;
if (RHCode = ERAR_BAD_DATA) then write(#13#10'File header broken');
RARCloseArchive(hArcData);
end;
procedure ExtractArchive(ArcName:PChar;Mode:integer);
var
hArcData:THandle;
RHCode,PFCode :integer;
CmtBuf:array [0..16383] of char;
HeaderData: RARHeaderData;
OpenArchiveData: RAROpenArchiveData;
begin
OpenArchiveData.ArcName:=ArcName;
OpenArchiveData.CmtBuf:=CmtBuf;
OpenArchiveData.CmtBufSize:=sizeof(CmtBuf);
OpenArchiveData.OpenMode:=RAR_OM_EXTRACT;
hArcData:=RAROpenArchive(OpenArchiveData);
if (OpenArchiveData.OpenResult<>0) then begin
OutOpenArchiveError(OpenArchiveData.OpenResult,ArcName);
exit;
end;
if (OpenArchiveData.CmtState = 1) then
ShowComment(CmtBuf);
RARSetChangeVolProc(hArcData,ChangeVolProc);
if (Mode = PRINT) then
RARSetProcessDataProc(hArcData,ProcessDataProc);
HeaderData.CmtBuf:=nil;
RHCode:=RARReadHeader(hArcData,HeaderData);
while (RHCode = 0) do begin
case (Mode) of
EXTRACT: write(#13#10'Extracting ',HeaderData.FileName:45);
TEST: write(#13#10'Testing ',HeaderData.FileName:45);
PRINT: writeln(#13#10'Printing ',HeaderData.FileName:45);
end;
if (Mode = EXTRACT) then
PFCode:=RARProcessFile(hArcData,RAR_EXTRACT,nil,nil)
else
PFCode:=RARProcessFile(hArcData,RAR_TEST,nil,nil);
if (PFCode <> 0) then begin
OutProcessFileError(PFCode);
break;
end;
write('ok');
RHCode:=RARReadHeader(hArcData,HeaderData);
end; // while
if (RHCode = ERAR_BAD_DATA) then write(#13#10'File header broken');
RARCloseArchive(hArcData);
end;
begin
if (ParamCount<2) then
OutHelp
else
case UpCase(ParamStr(1)[1]) of
'X':ExtractArchive(PChar(ParamStr(2)),EXTRACT);
'T':ExtractArchive(PChar(ParamStr(2)),TEST);
'P':ExtractArchive(PChar(ParamStr(2)),PRINT);
'L':ListArchive(PChar(ParamStr(2)));
else
OutHelp
end;
end.
"Jean-Yves" a écrit dans le message de
news:cpv5lk$cld$
> Bonjour,
>
> J'aimerais savoir combien de fichiers sont compris dans une archive au
> format rar. Connaissez-vous une façon simple de le faire en C ou C++ ?
> J'ai téléchargé l'api "unrar" chez www.rarlab.com mais il n'y a pas de
> documentation fournie.
jai un exemple d'utilisation de la dll en delphi, je le post ici (ca pas
compliqué a convertir en c++)
desolé pour l'indentation, mais ca la perdu en collant
------------------------ fichier
unrar.pas -------------------------------------
unit unrar;
interface
uses Windows;
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
RARHeaderData=record
ArcName :array [0..259] of char;
FileName :array [0..259] of char;
Flags,
PackSize,
UnpSize,
HostOS,
FileCRC,
FileTime,
UnpVer,
Method,
FileAttr: UINT;
CmtBuf:PChar;
CmtBufSize,
CmtSize,
CmtState: UINT;
end;
RAROpenArchiveData=record
ArcName :PChar;
OpenMode :UINT;
OpenResult:UINT ;
CmtBuf :PChar;
CmtBufSize:UINT;
CmtSize :UINT;
CmtState :UINT;
end;
TChangeVolProc =function(ArcName:PChar;Mode:integer):integer cdecl export;
TProcessDataProc=function(Addr:PUCHAR;Size:integer):integer cdecl export;
function RAROpenArchive(var ArchiveDate:RAROpenArchiveData):THandle;
pascal; external 'unrar.dll';
function RARCloseArchive(hArcData : THandle):integer;
stdcall; external 'unrar.dll';
function RARReadHeader(hArcData:THandle;var
HeaderData:RARHeaderData):integer;
stdcall; external 'unrar.dll';
function
nteger;
stdcall; external 'unrar.dll';
procedure
RARSetChangeVolProc(hArcData:THandle;ChangeVolProc:TChangeVolProc);
stdcall; external 'unrar.dll';
procedure
RARSetProcessDataProc(hArcData:THandle;ProcessDataProc:TProcessDataProc);
stdcall; external 'unrar.dll';
procedure RARSetPassword(hArcData:THandle;Password:PChar);
stdcall; external 'unrar.dll';
implementation
end.
--------------------------------------------------------------------------
-------------------------------------
----------------------------------------- fichier 2 -----------------
program UnRdllp;
uses Windows,Unrar;
const
EXTRACT = 0;
TEST = 1;
PRINT = 2;
procedure ShowComment(CmtBuf : PChar);
begin
writeln(#13#10'Comment:'#13#10,CmtBuf,#13#10);
end;
procedure OutHelp;
begin
write(#13#10'UNRDLL. This is a simple example of UNRAR.DLL usage'#13#10);
write(#13#10'Syntax:'#13#10);
write(#13#10'UNRDLL X <Archive> extract archive contents');
write(#13#10'UNRDLL T <Archive> test archive contents');
write(#13#10'UNRDLL P <Archive> print archive contents to stdout');
write(#13#10'UNRDLL L <Archive> view archive contents'#13#10);
end;
function ChangeVolProc(ArcName:PChar;Mode:integer):integer; cdecl export;
var
Ch: char;
begin
result:=1;
if (Mode = RAR_VOL_ASK) then begin
write(#13#10'Insert disk with ',ArcName,' and press ''Enter'' or enter
to exit ');
Readln(Ch);
Result:= Integer(UpCase(Ch)<>'Q');
end;
end;
function ProcessDataProc(Addr:PUCHAR;Size:integer):integer; cdecl export;
var res:DWORD;
begin
Flush(Output);
WriteFile(GetStdHandle(STD_OUTPUT_HANDLE),Addr,Size,Res,nil);
Flush(Output);
result:=1;
end;
procedure OutOpenArchiveError(Error:integer; ArcName:PChar);
begin
case Error of
ERAR_NO_MEMORY: write(#13#10'Not enough memory');
ERAR_EOPEN: write(#13#10'Cannot open ',ArcName);
ERAR_BAD_ARCHIVE:write(#13#10,ArcName,' is not RAR archive');
ERAR_BAD_DATA: write(#13#10,ArcName,': archive header broken');
end;
end;
procedure OutProcessFileError(Error:integer);
begin
case Error of
ERAR_UNKNOWN_FORMAT:write('Unknown archive format');
ERAR_BAD_ARCHIVE: write('Bad volume');
ERAR_ECREATE: write('File create error');
ERAR_EOPEN: write('Volume open error');
ERAR_ECLOSE: write('File close error');
ERAR_EREAD: write('Read error');
ERAR_EWRITE: write('Write error');
ERAR_BAD_DATA: write('CRC error');
end;
end;
procedure ListArchive(ArcName : PChar);
var
hArcData:THandle;
RHCode,PFCode:integer;
CmtBuf:array [0..16383] of char;
HeaderData: RARHeaderData;
OpenArchiveData:RAROpenArchiveData;
begin
OpenArchiveData.ArcName:=ArcName;
OpenArchiveData.CmtBuf:=CmtBuf;
OpenArchiveData.CmtBufSize:=sizeof(CmtBuf);
OpenArchiveData.OpenMode:=RAR_OM_LIST;
hArcData:=RAROpenArchive(OpenArchiveData);
if (OpenArchiveData.OpenResult <> 0) then begin
OutOpenArchiveError(OpenArchiveData.OpenResult,ArcName);
Exit;
end;
if (OpenArchiveData.CmtState = 1) then ShowComment(CmtBuf);
RARSetChangeVolProc(hArcData,ChangeVolProc);
HeaderData.CmtBuf:=CmtBuf;
HeaderData.CmtBufSize:=sizeof(CmtBuf);
write(#13#10'File Size');
write(#13#10'-------------------------------');
RHCode:=RARReadHeader(hArcData, HeaderData);
while (RHCode = 0) do begin
write(#13#10,HeaderData.FileName,' ',HeaderData.UnpSize,' ');
if (HeaderData.CmtState = 1) then ShowComment(CmtBuf);
PFCode:=RARProcessFile(hArcData,RAR_SKIP,nil,nil);
if (PFCode<>0) then begin
OutProcessFileError(PFCode);
break;
end;
RHCode:=RARReadHeader(hArcData, HeaderData)
end;
if (RHCode = ERAR_BAD_DATA) then write(#13#10'File header broken');
RARCloseArchive(hArcData);
end;
procedure ExtractArchive(ArcName:PChar;Mode:integer);
var
hArcData:THandle;
RHCode,PFCode :integer;
CmtBuf:array [0..16383] of char;
HeaderData: RARHeaderData;
OpenArchiveData: RAROpenArchiveData;
begin
OpenArchiveData.ArcName:=ArcName;
OpenArchiveData.CmtBuf:=CmtBuf;
OpenArchiveData.CmtBufSize:=sizeof(CmtBuf);
OpenArchiveData.OpenMode:=RAR_OM_EXTRACT;
hArcData:=RAROpenArchive(OpenArchiveData);
if (OpenArchiveData.OpenResult<>0) then begin
OutOpenArchiveError(OpenArchiveData.OpenResult,ArcName);
exit;
end;
if (OpenArchiveData.CmtState = 1) then
ShowComment(CmtBuf);
RARSetChangeVolProc(hArcData,ChangeVolProc);
if (Mode = PRINT) then
RARSetProcessDataProc(hArcData,ProcessDataProc);
HeaderData.CmtBuf:=nil;
RHCode:=RARReadHeader(hArcData,HeaderData);
while (RHCode = 0) do begin
case (Mode) of
EXTRACT: write(#13#10'Extracting ',HeaderData.FileName:45);
TEST: write(#13#10'Testing ',HeaderData.FileName:45);
PRINT: writeln(#13#10'Printing ',HeaderData.FileName:45);
end;
if (Mode = EXTRACT) then
PFCode:=RARProcessFile(hArcData,RAR_EXTRACT,nil,nil)
else
PFCode:=RARProcessFile(hArcData,RAR_TEST,nil,nil);
if (PFCode <> 0) then begin
OutProcessFileError(PFCode);
break;
end;
write('ok');
RHCode:=RARReadHeader(hArcData,HeaderData);
end; // while
if (RHCode = ERAR_BAD_DATA) then write(#13#10'File header broken');
RARCloseArchive(hArcData);
end;
begin
if (ParamCount<2) then
OutHelp
else
case UpCase(ParamStr(1)[1]) of
'X':ExtractArchive(PChar(ParamStr(2)),EXTRACT);
'T':ExtractArchive(PChar(ParamStr(2)),TEST);
'P':ExtractArchive(PChar(ParamStr(2)),PRINT);
'L':ListArchive(PChar(ParamStr(2)));
else
OutHelp
end;
end.