DETECTER LE TYPE D'ARCHIVE (ZIP, ACE, RAR) GRACE AU SIGNATURES

cs_Delphiprog Messages postés 4297 Date d'inscription samedi 19 janvier 2002 Statut Membre Dernière intervention 9 janvier 2013 - 12 avril 2004 à 00:00
SiZiOUS Messages postés 69 Date d'inscription samedi 25 octobre 2003 Statut Membre Dernière intervention 29 novembre 2006 - 27 oct. 2004 à 23:03
Cette discussion concerne un article du site. Pour la consulter dans son contexte d'origine, cliquez sur le lien ci-dessous.

https://codes-sources.commentcamarche.net/source/21844-detecter-le-type-d-archive-zip-ace-rar-grace-au-signatures

SiZiOUS Messages postés 69 Date d'inscription samedi 25 octobre 2003 Statut Membre Dernière intervention 29 novembre 2006
27 oct. 2004 à 23:03
=)
cs_PaTaTe Messages postés 2126 Date d'inscription mercredi 21 août 2002 Statut Contributeur Dernière intervention 19 février 2021 2
27 oct. 2004 à 22:35
Merci d'avoir converti tout ca en Delphi :)
cs_grandvizir Messages postés 1106 Date d'inscription samedi 8 novembre 2003 Statut Membre Dernière intervention 3 septembre 2006 22
27 oct. 2004 à 20:26
Je traduit bêtement (j'explique après) le VB de Patate:

//++++ début ++++//
function UnZipCheckArchive(szFilename:string; imode:integer):integer; external 'unzip32';
function UnRarCheckArchive(szFilename:string; imode:integer):integer; external 'unrar32';

procedure ChercherTypeArchive(FileName:string);
var ArcCheck : string;
begin
ArcCheck:='Rien détecté';
if UnZipCheckArchive(FileName, 1)<>0 then
ArcCheck:="Archive ZIP detectée."
else
if UnrarCheckArchive(FileName, 1)<>0 then
ArcCheck:='Archive RAR detectée.';
ShowMessage(ArcCheck);
end;
//++++ fin ++++//


En fait, le passage de String à travers des appels de librairies n'est pas correctement supporté pour des raisons expliquées dans l'aide de Delphi. Il y a une astuce: String ==> PChar. On passe donc aux PChar, comme c'est souvent le cas dans les déclarations de Windows.pas. Nous obtenons donc:


//++++ début ++++//
function UnZipCheckArchive(szFilename:PChar; imode:integer):integer; external 'unzip32';
function UnRarCheckArchive(szFilename:PChar; imode:integer):integer; external 'unrar32';

procedure ChercherTypeArchive(FileName:string);
var ArcCheck : string;
begin
ArcCheck:='Rien détecté';
if UnZipCheckArchive(PChar(FileName), 1)<>0 then
ArcCheck:="Archive ZIP detectée."
else
if UnrarCheckArchive(PChar(FileName), 1)<>0 then
ArcCheck:='Archive RAR detectée.';
ShowMessage(ArcCheck);
end;
//++++ fin ++++//

Ca ne change a priori pas grand chose puisque PChar=String (enfin presque).

L'utilisation de ces fonctions semblent (et sont) la méthode la plus saine.

Notons que ces infos ne sont là qu'à titre indicatif puisque je n'ai pas les bibliothèques en question. Mais je vois la chose ainsi...
cs_PaTaTe Messages postés 2126 Date d'inscription mercredi 21 août 2002 Statut Contributeur Dernière intervention 19 février 2021 2
7 oct. 2004 à 11:42
Je crois pas puique c'est du VB6 :)
SiZiOUS Messages postés 69 Date d'inscription samedi 25 octobre 2003 Statut Membre Dernière intervention 29 novembre 2006
7 oct. 2004 à 06:16
Dans ce cas il te servira pour autre chose =)
Tu peux poster ta méthode sur DelphiFr apres tout ;)
cs_PaTaTe Messages postés 2126 Date d'inscription mercredi 21 août 2002 Statut Contributeur Dernière intervention 19 février 2021 2
6 oct. 2004 à 20:50
Pour moi ca va j'en detecte a peu pres une dizaine avec la methode donnée plus haut ...
SiZiOUS Messages postés 69 Date d'inscription samedi 25 octobre 2003 Statut Membre Dernière intervention 29 novembre 2006
6 oct. 2004 à 20:38
En tout cas j'espère que ce code pourra te servir pour autre chose, ou même pour détecter un type d'archive =)
cs_PaTaTe Messages postés 2126 Date d'inscription mercredi 21 août 2002 Statut Contributeur Dernière intervention 19 février 2021 2
4 oct. 2004 à 23:29
oui effectivement :)

Ta methode reste execellent car elle a pas de dependance contrairement à moi
SiZiOUS Messages postés 69 Date d'inscription samedi 25 octobre 2003 Statut Membre Dernière intervention 29 novembre 2006
4 oct. 2004 à 21:07
Oui, tu as tous à fait raison. Après tout, c'est toi qui a raison au niveau du code :)

En fait on a tous les deux raison ! Seulement toi tu utilise les fonctions des DLL et moi rien du tout, mais le résultat est le même ;)
cs_PaTaTe Messages postés 2126 Date d'inscription mercredi 21 août 2002 Statut Contributeur Dernière intervention 19 février 2021 2
4 oct. 2004 à 11:52
Autant regrouper ce qui peut l'etre sinon ca devient n'importe quoi ! Ce qui commence d'ailleurs
SiZiOUS Messages postés 69 Date d'inscription samedi 25 octobre 2003 Statut Membre Dernière intervention 29 novembre 2006
4 oct. 2004 à 06:15
et les forums ca sert à quoi lol
cs_PaTaTe Messages postés 2126 Date d'inscription mercredi 21 août 2002 Statut Contributeur Dernière intervention 19 février 2021 2
3 oct. 2004 à 23:22
OK mais pour les developeur debutant, il est important de montrer toutes les manieres de faire pour une même chose :)

sans rancune lol
SiZiOUS Messages postés 69 Date d'inscription samedi 25 octobre 2003 Statut Membre Dernière intervention 29 novembre 2006
3 oct. 2004 à 12:36
Désolé je ne lit pas le VB. La tu n'a besoin d'aucune DLL :) Non plus serieusement c'était plutot un exercice pour lire l'en-tête d'un fichier plutot qu'autre chose.
cs_PaTaTe Messages postés 2126 Date d'inscription mercredi 21 août 2002 Statut Contributeur Dernière intervention 19 février 2021 2
3 oct. 2004 à 04:41
Oula tu aimes te compliquer la vie SiZiOUS !

Il faut savoir que la quazi totalité des DLL de decompression ont une fontion pour la detection du type de l'archive.

Comme je suis VBiste, je ne connsais pas la syntaxe Delphi alors je cais mettre la version VB. Tu pourra surement retransposer ca dans ton language.


'Appel des DLL
Private Declare Function UnZipCheckArchive Lib "unzip32" (ByVal szFilename As String, ByVal imode As Long) As Long
Private Declare Function UnrarCheckArchive Lib "UnRAR32" (ByVal szFilename As String, ByVal imode As Long) As Long


Function ChercherTypeArchive(FileName As String) As String
Dim ArcCheck As String
If UnZipCheckArchive(FileName, 1) <> 0 Then
ArcCheck = "Archive ZIP detectée."
elseif UnrarCheckArchive(FileName, 1) <> 0 Then
ArcCheck = "Archive RAR detectée."
End If
MsgBox ArcCheck
End Function


De plus les declaration de DLL fonctionne pour les DLL LHA, 7-ZIP, CAB, TAR, ARJ

Pourquoi faire compliqué quand on peut faire simple :)
SiZiOUS Messages postés 69 Date d'inscription samedi 25 octobre 2003 Statut Membre Dernière intervention 29 novembre 2006
31 août 2004 à 18:44
et aussi winrar en open source?

compress/decompress y'en a des millions d'exemples. -> Google ou DelphiFR.
cs_yafou Messages postés 8 Date d'inscription dimanche 29 décembre 2002 Statut Membre Dernière intervention 31 août 2004
31 août 2004 à 13:56
dire ça servirait à koi ton truc
si vous aurez mi l'exemple comme compresser decompresser un fichier, ça serait mieux.
Bombela Messages postés 225 Date d'inscription mardi 4 mars 2003 Statut Membre Dernière intervention 30 juillet 2008
20 avril 2004 à 21:02
C'et très simple après.

Je te donne un exemple :

Interface

TFruit = (Pomme,Poire,Orange);

Implementation

var MonFruit: TFruit;

begin

MonFruit := Pomme;

if MonFruit = Poire thren ShowMessage('Zut !');

end.

Juste un exemple d'utilisation...

Si tu veux un exmple programmé ==> supercar@tiscali.fr

Bye
SiZiOUS Messages postés 69 Date d'inscription samedi 25 octobre 2003 Statut Membre Dernière intervention 29 novembre 2006
20 avril 2004 à 17:09
Oh la je sais pas faire du tout ca...

Mais merci du conseil Bombela :)
Bombela Messages postés 225 Date d'inscription mardi 4 mars 2003 Statut Membre Dernière intervention 30 juillet 2008
20 avril 2004 à 14:51
Pour faire un type énuméré :

TMyEnumType = (Type1,Type2,Type3);

Si me suis pas trompé, ça marche.

Bye.
SiZiOUS Messages postés 69 Date d'inscription samedi 25 octobre 2003 Statut Membre Dernière intervention 29 novembre 2006
12 avril 2004 à 11:48
Merci ;)

Ohla!!! "type énuméré"... doucement ^^
Nan tu vois j'aurai bien voulu que ce soit plus visible, mais j'ai pas réussi, donc si tu peux l'améliorer dans ce sens, ca serai bien.
Merci Delphiprog!
cs_Delphiprog Messages postés 4297 Date d'inscription samedi 19 janvier 2002 Statut Membre Dernière intervention 9 janvier 2013 32
12 avril 2004 à 00:00
Pas mal !
Dans Main.pas, tu écris :
"impossible de mettre FILE_IS_UNKNOW à la place de "0" ou je sais pas faire..."
Pour celà, tu aurais dû déclarer un type énuméré et l'utiliser comme valeur de retour de la fonction DetectArchiveType.
Mais comme tu as déclaré des constantes entières et un entier comme valeur de retour, il est donc normal que le compilateur ne puisse pas faire le rapprochement entre les uns et les autres.
C'est sur que ça aiderait pour la lisibilité mais ça n'apporterait rien en termes de performances à ta fonction. Ca peut donc rester comme ça.
Evidemment, s'il y avait davantage de valeurs de retour à mémoriser, ce serait un plus appréciable.
Rejoignez-nous