Zipper un repertoire en conservant la hierarchie des dossiers

Soyez le premier à donner votre avis sur cette source.

Snippet vu 14 609 fois - Téléchargée 34 fois

Contenu du snippet

Ceci permet de zipper un dossier grace à la dll #ZipLib tout en conservant l'organisation du dossier. Pour avoir plus d'info sur #ZipLib (SharpZipLib) consulter l'article sur DotNetGuru http://www.techheadbrothers.com/DesktopDefault.aspx?tabindex=1&tabid=7&AId=23

Je sais qu'il existe deja cette source sur vbfrance : http://www.vbfrance.com/code.aspx?id=25357 mais elle ne prend pas en compte un dossier, juste quelque fichiers isolés.

Le code est loin d'etre parfait, j'ai fait cette source pour un petit trucs que j'avais besoin rapidement, j'ai donc pas optimisé du tout, il faudrais au moins mettre ca dans un thread pouvoir choisir le dossier en paramètre etc...

Source / Exemple :


imports ICSharpCode.SharpZipLib.Zip
imports System.io

    'On déclare une arraylist qui contiendras tous les fichiers
    Private ListeInfo As New ArrayList

    ' La fonction qui va remplir notre arraylist
    Private Function ListeFichier(ByVal repertoire As DirectoryInfo, ByVal Reset As Boolean) As ArrayList

        If Reset = True Then
            ListeInfo.Clear()
        End If

        If repertoire.GetDirectories.Length <> 0 Then
            For Each repertoire2 As DirectoryInfo In repertoire.GetDirectories
                ListeFichier(repertoire2, False)
            Next
        End If

        For Each fichier As FileInfo In repertoire.GetFiles("*.*")

            ListeInfo.Add(fichier.FullName)
        Next

        Return ListeInfo

    End Function

    Private Sub Button1_Click(ByVal sender As System.Object, ByVal e As System.EventArgs)

		Dim isError as string 
		
		Try 
			Dim DI As New DirectoryInfo("D:\Documents\")
			Dim astrFileNames As ArrayList = ListeFichier(DI, True)
			Dim strmZipOutputStream As ZipOutputStream

			strmZipOutputStream = New ZipOutputStream(File.Create("D:\Documents " & now.ToString("dd.MMMM.yyyy hh-mm") & ".zip"))
 			
			'Nombre de 1 à 9:  9 plus compressé
			strmZipOutputStream.SetLevel(9)

			For Each strFile As String In astrFileNames
				Dim strmFile As FileStream = File.OpenRead(strFile)
				Dim abyBuffer(strmFile.Length - 1) As Byte

				strmFile.Read(abyBuffer, 0, abyBuffer.Length)
				Dim RelatifstrFile As String
				RelatifstrFile = strFile.Substring("D:\Documents\".Length)
				Dim objZipEntry As ZipEntry = New ZipEntry(RelatifstrFile)

				objZipEntry.DateTime = DateTime.Now
				objZipEntry.Size = strmFile.Length
				strmFile.Close()
				strmZipOutputStream.PutNextEntry(objZipEntry)
				strmZipOutputStream.Write(abyBuffer, 0, abyBuffer.Length)
			Next

			strmZipOutputStream.Finish()
			strmZipOutputStream.Close()

		Catch ex as Exception
			isError = "Erreur :" & VbNewLine & ex.tostring
		end try 
	
		if isError is nothing Then isError = "c'est OK, le zip est fait"
		label1.text = isError

    End Sub

Conclusion :


J'attends vos commentaires sur cette source

Un bug est connu : Si un des dossiers à zipper est vide, il ne sera pas présent dans le zip, je n'ai pas prévu de le corriger pour l'instant.

A voir également

Ajouter un commentaire

Commentaires

Messages postés
30
Date d'inscription
mardi 30 mai 2006
Statut
Membre
Dernière intervention
13 mars 2009

Merci ^^

Et merci à tous pour votre aide !

A bientôt je pense ... :D
Messages postés
17286
Date d'inscription
mercredi 2 janvier 2002
Statut
Modérateur
Dernière intervention
23 décembre 2019
64
"pour ta défense" ... bon, tu t'es aperçu de la bourde, certes, mais copier-coller ne dispense pas (la preuve) de relire, comprendre, absorber...

^^

bonne continuation
Messages postés
30
Date d'inscription
mardi 30 mai 2006
Statut
Membre
Dernière intervention
13 mars 2009

Problème résolu, voici la solution :

byte[] Buffer = new byte[Convert.ToInt32(FileSize)];
MyFileStream.Read(Buffer, 0, Convert.ToInt32(FileSize-1));

C'est de la prog de base : on déclare un tableau de N case qui débute de 0 à N - 1 (en index). Donc forcement, si je déclare un tableau de FileSize-1 çà va pas le faire et du coup l'archive était corrompue par la taille...

Pour ma défense, je tiens à signaler que c'est un bout de code que j'avais récup du net :D
Messages postés
30
Date d'inscription
mardi 30 mai 2006
Statut
Membre
Dernière intervention
13 mars 2009

Merci pour les tuyaux ;)

J'ai réussi à m'en sortir, en mettant la propriété de l'update panel UpdateMode="Conditional"
et je le met à jour uniquement lorsque je clique à certains endroit.

Maintenant, du coup je peux modifier la response de mon update panel mais je suis confronter à un autre problème :

le fichier .zip généré est correcte lorsque je l'ouvre depuis la source physique (soit localement soit sur le serveur). Cependant, lorsque je le transmet via le Header de mon response l'archive est corrompue !!! Voici mon code :

private void TransmitFile(string path, string file)
{
Response.Clear();
FileStream MyFileStream = new FileStream(path, FileMode.Open, FileAccess.Read);
long FileSize = MyFileStream.Length;
byte[] Buffer = new byte[Convert.ToInt32(FileSize - 1)];
MyFileStream.Read(Buffer, 0, Convert.ToInt32(FileSize - 1));
MyFileStream.Close();
Response.BufferOutput = true;
Response.ClearContent();
Response.ClearHeaders();
Response.AddHeader("Content-Length", Buffer.Length.ToString());
Response.AddHeader("Content-Disposition", "attachment; filename=" + file);
Response.AddHeader("Content-Transfer-Encoding","binary");
Response.ContentType = "application/octet-stream";

Response.BinaryWrite(Buffer);
Response.Flush();

}

Une idée ? Merci
Messages postés
6814
Date d'inscription
dimanche 15 décembre 2002
Statut
Modérateur
Dernière intervention
13 octobre 2010
25
Afficher les 23 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.