Twitter iPhone pliant OnePlus 11 PS5 Disney+ Orange Livebox Windows 11

Accès par programme à un fichier rar

4 réponses
Avatar
Jean-Yves
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

4 réponses

Avatar
Pierre Maurette
Jean-Yves a écrit :
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.


Installez si ce n'est déjà fait WinRar (éval durée limitée). L'aide
documente longuement l'utilisation en ligne de commande. Mais il y a
mieux pour ce que vous voulez faire. Il est fourni unrar.exe qui est
gratuit et distribuable. Si vous ne trouvez pas autre chose, en ligne de
commande, faites unrar /?. Avec quelques essais, c'est sans doute suffisant.
Avez-vous vérifié si ce ne serait pas possible avec zlib ?
--
Pierre
Avatar
Thierry
"Jean-Yves" écrivait news:cpv5lk$cld$1
@s5.feed.news.oleane.net:

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.



Ca pas l'air compliqué, ca ira peut-etre plus vite de le faire soit même
qu'utiliser une API sans soc:
http://www.wotsit.org/download.asp?f=rar_2
Avatar
dark poulpo
"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
RARProcessFile(hArcData:THandle;Operation:integer;DestPath,DestName:PChar):i
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 ''Q''
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.
Avatar
Jean-Yves
Merci beaucoup dark poulpo !

"dark poulpo" a écrit dans le message de
news:41c3e4f3$0$22326$

"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



RARProcessFile(hArcData:THandle;Operation:integer;DestPath,DestName:PChar):i
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


''Q''
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.