Zipper un repertoire en conservant la hierarchie des dossiers

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

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.