Gestion complète de zip - zipdezip

Soyez le premier à donner votre avis sur cette source.

Vue 125 435 fois - Téléchargée 2 396 fois

Description

'caractéristiques de l'application :
'en VB.NET pur à 100% (pas d'install ni ocx ni dll particulière...) =>OK
'compatible 100 % avec Izarc => OK
'prise en compte accentués,espaces... => OK
'création, modifications , avec ou sans arborescences.=>OK
'création de dossiers, déplacement de fichier d'un dossier à l'autre => OK
'design type explorateur windows - 2 fenetres treewiev et listview => OK
'Visu par double clic de tout fichier du Zip (extraction + lancement d'un temporaire effacé en sortie) => 0K
'modif commentaire global du ZIP => OK
'supprimer,renommer un fichier ,le déplacer vers un autre dossier du Zip
'le crypter, lui ajouter un commentaire et un mot de passe => OK
'Extractions multiples, extractions d'un dossier ... vers une destination choisie => 0K
'visu de la structure d'un ZIP , et d'un fichier du Zip => OK
'Modification du contenu par visu/modification d'un fichier du Zip => OK
'glissés, drag and drop , et ligne de commande =>OK

Source / Exemple :


Structure d'un ZIP : voir zip.doc dans ressources...
Mémento des options de la ligne de commande de ZipDeZip.exe :
Une  seul argument avec paires clé=valeur (ne doit pas contenir d'espace,sinon mettre entre guillemets)
Exemple de programmation :  Shell (ZipDeZip.EXE  "?nomzip=d:\tests\essai 0.zip&action=extraction",vbhide)
?nomzip=chemin/nom.zip  : chemin d'accés du Zip  , suivi -  sans espace - des paires séparées par & : 
&action=nouveau ou ajout ou extraction ou suppression ou remplacement
&base=cheminrelatif : OPTIONNEL (si omis : conservation chemins absolus sinon chemin Zip, si vide=> racine Zip
&listedossfich=chemfich1 ou fich1;chemdossier2 ou dossier2;etc...  : OPTIONNEL 
                    => liste des fichiers-dossiers avec chemin absolus si action = ajout-creation-remplacement
                    => ou fichiers sans chemins, et dossiers relatif à la racine du zip si action = extractions-suppression
&destination=dossierextraction : OPTIONNEL
                    => si omis extraction sur place , si contient x:=> destination absolu, sinon destination relative au Zip 

Exemples testés avec espaces et accentués:  

- Création (avec chemins absolus  conservés)  ==> zipdezip.exe "?nomzip=d:\tests zipdezip\essai 0.zip&action=nouveau&listedossfich=D:\autorun.inf;d:\usr\dossier testé"
       => (sans arborescence)         "?nomzip=d:\tests zipdezip\essai 1.zip&base=&action=nouveau&listedossfich=D:\autorun.inf;d:\usr\dossier testé"
      =>  (avec chemin relatif fixé)   "?nomzip=d:\tests zipdezip\essai 2.zip&base=essai 2&action=nouveau&listedossfich=D:\autorun.inf;d:\usr\dossier testé"
- Extraction sur place  ==> zipdezip.exe "?nomzip=d:\tests zipdezip\essai 0.zip&action=extraction"
      =>dans un dossier "?nomzip=d:\tests zipdezip\essai 2.zip&action=extraction&destination=d:\extraction"
- Extraction partielle ==> zipdezip.exe "?nomzip=d:\tests zipdezip\essai 0.zip&action=extraction&listedossfich=autorun.bat;usr/test"
- Ajouts  (avec conservation chemin)==>  "?nomzip=d:\tests zipdezip\essai 0.zip&action=ajout&listedossfich=d:\usr\bin\c2ph.bat"
      => (dans la racine)==>  "?nomzip=d:\tests zipdezip\essai 0.zip&action=ajout&base=&listedossfich=d:\usr\test"
      =>(dans chemin relatif fixé)==>  "?nomzip=d:\tests zipdezip\essai 0.zip&action=ajout&base=ajouté&listedossfich=d:\usr\test"
- Suppression  (supprime tous les fichiers de ce nom (plusieurs possibles si arborescence), quelque soit son dossier dans le Zip) "?nomzip=d:\tests zipdezip\essai 0.zip&action=suppression&listedossfich=autorun.inf;donnees.ico"
- Remplacements  (avant Ajout, supprime tous les fichiers de ce nom (plusieurs possibles si arborescence)   "?nomzip=d:\tests zipdezip\essai 0.zip&action=remplacement&listedossfich=D:\autorun.inf"

Conclusion :


Pour tout savoir sur la structure d'un Zip.
à complémenter : le cryptage, que j'ai baclé avec un Xor clé.

Codes Sources

A voir également

Ajouter un commentaire

Commentaires

Messages postés
1221
Date d'inscription
jeudi 23 août 2001
Statut
Membre
Dernière intervention
9 septembre 2018

Ok, cela utilise les flux compressés de DotNet, merci pour les infos. Pour que je mette une note, il faudrait que je compare l'intérêt de ta méthode par rapport à ICSharpCode.SharpZipLib.dll que j'ai l'habitude d'utiliser, mais à première vue ton travail à l'air impressionnant, bravo.
Messages postés
46
Date d'inscription
jeudi 2 novembre 2006
Statut
Membre
Dernière intervention
5 juin 2010

Oui, j'ai fait ça tout seul,en autodidacte que je suis, en reprenant les infos sur la structure du Zip dans appnotes..
Les modules de compression/decompression ne sont pas de moi.
... si tu veux me récompenser par une note ... ça faut toujours plaisir...

=> Pour les gros fichiers >2go : voir ci-dessous, si ça peut t'interesser...

Public Function Compresse(ByVal Source As String, ByVal Destination As String) As Long
Try
Dim taillef = taille(Source)
Dim bloc As Integer
If taillef > &HFFFFFFFF Then
bloc = Int32.MaxValue \ 100 'limiter la taille du tampon à 1 centième du maximum de maxint32
Else
If taillef \ 1024 > 0 Then bloc = taillef \ 1024 Else bloc = taillef 'car taillef\1024 peut être nul pour les petits fichiers
End If
Dim lecteur As New BinaryReader(File.OpenRead(Source))
Dim GData(bloc) As Byte
Dim passe As Integer
Dim nb As Long = 0
Dim encore As Boolean
Dim scripteur As FileStream = New FileStream(Destination, FileMode.Create, FileAccess.Write, FileShare.Write)
Dim Zipeur As DeflateStream = New DeflateStream(scripteur, CompressionMode.Compress)
lecteur.BaseStream.Seek(0, SeekOrigin.Begin)

passe = lecteur.Read(GData, 0, bloc)
Zipeur.Write(GData, 0, passe)
nb = nb + passe
suivi("", nb, False, False)
encore = passe < lecteur.BaseStream.Length
Do While (encore)
passe = lecteur.Read(GData, 0, GData.Length)
If passe > 0 Then
scripteur.Write(GData, 0, passe)
nb = nb + passe
End If
encore = passe > 0
Loop
lecteur.Close()
Zipeur.Close()
Return taille(Destination)
Catch ex As Exception
MsgBox("Erreur Compression :" + ex.Message + Chr(10) + ex.StackTrace)
Return 0
End Try
End Function
Public Function Decompresse(ByVal Source As String, ByVal Destination As String) As Long
Dim Lecteur As New BinaryReader(File.OpenRead(Source))
Dim Zipeur As DeflateStream = New DeflateStream(Lecteur.BaseStream, CompressionMode.Decompress)
Dim Scripteur As New BinaryWriter(File.Create(Destination))

Try
Dim taillef = taille(Source)
Dim bloc As Integer
If taillef > Int32.MaxValue Then
bloc = Int32.MaxValue \ 100 'limiter la taille du tampon à 1 centième du maximum de maxint32
Else
If taillef \ 1024 > 0 Then bloc = taillef \ 1024 Else bloc = taillef 'car taillef\1024 peut être nul pour les petits fichiers
End If
Dim Gdata(bloc) As Byte
Dim Passe As Integer
Dim nb As Long
Dim encore As Boolean = True
Do
Passe = Zipeur.Read(Gdata, 0, Gdata.Length)
nb = Passe
If Passe > 0 Then
encore = True
Scripteur.Write(Gdata, 0, Passe)
nb = nb + Passe
Else
encore = False
End If
Loop While (encore)
Lecteur.Close()
Scripteur.Close()
Zipeur.Close()
Return taille(Destination)
Catch ex As Exception
Lecteur.Close()
Scripteur.Close()
Zipeur.Close()
MsgBox("Erreur décompression :" + ex.Message + Chr(10) + ex.StackTrace)
Return 0
End Try
End Function
Messages postés
1221
Date d'inscription
jeudi 23 août 2001
Statut
Membre
Dernière intervention
9 septembre 2018

Ok merci, mais mes 2 autres questions ?
Messages postés
46
Date d'inscription
jeudi 2 novembre 2006
Statut
Membre
Dernière intervention
5 juin 2010

pour répondre aux commentaires :
Nouveau zip avec dossier image...
A vous d'adapter aux autres structures de fichiers compressés, j'ai eu assez de travail avec
les ZIP pour cette application...
L'intégrité du Zip est testé par la demande de la structure du Zip, par le menu fichier..
Pour la plupart des fonctions, les fichiers sont traités en stream, mais cela peut devenir plus long pour les gros fichiers...
Messages postés
257
Date d'inscription
jeudi 11 septembre 2008
Statut
Membre
Dernière intervention
22 décembre 2012
1
Bonjour

Il existe pas un équivalent pour les fichiers .rar ou 7z ?

Mais sinon ca à l'air plutôt sympa comme code
Afficher les 6 commentaires

Vous n'êtes pas encore membre ?

inscrivez-vous, c'est gratuit et ça prend moins d'une minute !

Les membres obtiennent plus de réponses que les utilisateurs anonymes.

Le fait d'être membre vous permet d'avoir un suivi détaillé de vos demandes et codes sources.

Le fait d'être membre vous permet d'avoir des options supplémentaires.