DETECTER LE TYPE D'ARCHIVE (ZIP, ACE, RAR) GRACE AU SIGNATURES
cs_Delphiprog
Messages postés4297Date d'inscriptionsamedi 19 janvier 2002StatutMembreDernière intervention 9 janvier 2013
-
12 avril 2004 à 00:00
SiZiOUS
Messages postés69Date d'inscriptionsamedi 25 octobre 2003StatutMembreDernière intervention29 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.
SiZiOUS
Messages postés69Date d'inscriptionsamedi 25 octobre 2003StatutMembreDernière intervention29 novembre 2006 27 oct. 2004 à 23:03
=)
cs_PaTaTe
Messages postés2126Date d'inscriptionmercredi 21 août 2002StatutContributeurDernière intervention19 février 20212 27 oct. 2004 à 22:35
Merci d'avoir converti tout ca en Delphi :)
cs_grandvizir
Messages postés1106Date d'inscriptionsamedi 8 novembre 2003StatutMembreDernière intervention 3 septembre 200622 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és2126Date d'inscriptionmercredi 21 août 2002StatutContributeurDernière intervention19 février 20212 7 oct. 2004 à 11:42
Je crois pas puique c'est du VB6 :)
SiZiOUS
Messages postés69Date d'inscriptionsamedi 25 octobre 2003StatutMembreDernière intervention29 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és2126Date d'inscriptionmercredi 21 août 2002StatutContributeurDernière intervention19 février 20212 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és69Date d'inscriptionsamedi 25 octobre 2003StatutMembreDernière intervention29 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és2126Date d'inscriptionmercredi 21 août 2002StatutContributeurDernière intervention19 février 20212 4 oct. 2004 à 23:29
oui effectivement :)
Ta methode reste execellent car elle a pas de dependance contrairement à moi
SiZiOUS
Messages postés69Date d'inscriptionsamedi 25 octobre 2003StatutMembreDernière intervention29 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és2126Date d'inscriptionmercredi 21 août 2002StatutContributeurDernière intervention19 février 20212 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és69Date d'inscriptionsamedi 25 octobre 2003StatutMembreDernière intervention29 novembre 2006 4 oct. 2004 à 06:15
et les forums ca sert à quoi lol
cs_PaTaTe
Messages postés2126Date d'inscriptionmercredi 21 août 2002StatutContributeurDernière intervention19 février 20212 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és69Date d'inscriptionsamedi 25 octobre 2003StatutMembreDernière intervention29 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és2126Date d'inscriptionmercredi 21 août 2002StatutContributeurDernière intervention19 février 20212 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és69Date d'inscriptionsamedi 25 octobre 2003StatutMembreDernière intervention29 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és8Date d'inscriptiondimanche 29 décembre 2002StatutMembreDernière intervention31 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és225Date d'inscriptionmardi 4 mars 2003StatutMembreDernière intervention30 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és69Date d'inscriptionsamedi 25 octobre 2003StatutMembreDernière intervention29 novembre 2006 20 avril 2004 à 17:09
Oh la je sais pas faire du tout ca...
Mais merci du conseil Bombela :)
Bombela
Messages postés225Date d'inscriptionmardi 4 mars 2003StatutMembreDernière intervention30 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és69Date d'inscriptionsamedi 25 octobre 2003StatutMembreDernière intervention29 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és4297Date d'inscriptionsamedi 19 janvier 2002StatutMembreDernière intervention 9 janvier 201332 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.
27 oct. 2004 à 23:03
27 oct. 2004 à 22:35
27 oct. 2004 à 20:26
//++++ 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...
7 oct. 2004 à 11:42
7 oct. 2004 à 06:16
Tu peux poster ta méthode sur DelphiFr apres tout ;)
6 oct. 2004 à 20:50
6 oct. 2004 à 20:38
4 oct. 2004 à 23:29
Ta methode reste execellent car elle a pas de dependance contrairement à moi
4 oct. 2004 à 21:07
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 ;)
4 oct. 2004 à 11:52
4 oct. 2004 à 06:15
3 oct. 2004 à 23:22
sans rancune lol
3 oct. 2004 à 12:36
3 oct. 2004 à 04:41
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 :)
31 août 2004 à 18:44
compress/decompress y'en a des millions d'exemples. -> Google ou DelphiFR.
31 août 2004 à 13:56
si vous aurez mi l'exemple comme compresser decompresser un fichier, ça serait mieux.
20 avril 2004 à 21:02
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
20 avril 2004 à 17:09
Mais merci du conseil Bombela :)
20 avril 2004 à 14:51
TMyEnumType = (Type1,Type2,Type3);
Si me suis pas trompé, ça marche.
Bye.
12 avril 2004 à 11:48
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!
12 avril 2004 à 00:00
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.