begin process at 2008 07 05 00:00:09
1 204 994 membres
509 nouveaux aujourd'hui
14 118 membres club

Vous ne trouvez pas de réponse à votre problème ? Alors posez la question dans le forum.
Souvenez-vous qu'il n'y a jamais de question bête, mais rester dans l'ignorance parce que l'on n'ose pas poser une question, ça c'est une erreur !

ZIPPER UN REPERTOIRE EN CONSERVANT LA HIERARCHIE DES DOSSIERS


Information sur la source

Catégorie :Fichier / Disque Source .NET ( DotNet ) Niveau : Débutant Date de création : 18/02/2005 Date de mise à jour : 19/02/2005 15:47:08 Vu : 9 174

Note :
5,67 / 10 - par 3 personnes
5,67 / 10

  • 1

  • 2

  • 3

  • 4

  • 5

  • 6

  • 7

  • 8

  • 9

  • 10

Commentaire sur cette source (23)
Ajouter un commentaire et/ou une note


Description

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

  • 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
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.
19 février 2005 15:47:08 :
Annonce d'un bug, si un dossier est vide.
  • signaler à un administrateur
    Commentaire de ludovicanceaux le 19/02/2005 13:40:42

    Franchement impec ta source à part quelque petit truc ss importance ke je vai modifié moi même komm on on ve stocké l'archive etc............
    Par contre dis moi tu sai komment dézipper la même archive????

  • signaler à un administrateur
    Commentaire de jesusonline le 19/02/2005 13:44:34 administrateur CS

    Je me suis pas posé la question pour dezipper la meme archive, car je m'en sert pour faire du stockage.

    Si t'as amélioré quelque chose, j'ai bien envie de voir :)

    Contacts moi par les messages privées, je te donnerais mon mail.

    Cyril

  • signaler à un administrateur
    Commentaire de ludovicanceaux le 20/02/2005 12:51:08

    Oh j'ai rien fait d'extravagant j'ai juste rajouter un OpenFiledialog à la l'endroit pour voir le chemin de destination de l'archive ici:
    strmZipOutputStream = New ZipOutputStream(File.Create("D:\Documents " & now.ToString("dd.MMMM.yyyy hh-mm") & ".zip"))
    Mais bon voilà de toue facon le code est très bien fait et ca sert à rien de le modifié davantage lolllllllll
    Bah je vais essayé de recherché de mon coté comment dézipper une archive et je te le dirai.

    En fait j'en ai besoin car ds mon appli dc j'ai un bouton export vers zip (et dc si il y a un export, il fô bien un import ossi sinon ca sert à rien llolllllllllllll)

  • signaler à un administrateur
    Commentaire de Benouille le 23/02/2005 13:01:09

    manque de commentaires pour moi (ou alors c'est trop compliqué pour mes petits yeux mais bon)

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

            Dim isError As String

    y a pas de handle?
    pourquoi iserror as string?
    deja iserror fait plus penser a un bouléen  et puis pourquoi le stocker dans une string, l'objet erreur et plus complet.

    autre point de détail tant que j'y suis a pinailler:
         If isError Is Nothing Then isError = "c'est OK, le zip est fait"
            label1.text = isError
    le fait de mettre le message que tout va bien dans l'erreur ... c'est crade non?


    en bref: bonne idée mais code crade et a retoucher pour l'exploiter réellement.

  • signaler à un administrateur
    Commentaire de jesusonline le 23/02/2005 14:53:23 administrateur CS

    ouais je suis d'accord que la source manque de commentaire, j'ai fait ca vite fait comme je l'ai dit, et j'ai pas chercher à optimiser le truc.

    Pour le problème du handles, oui on peut croire qu'il y a un problème, mais en fait, j'ai fait cette source, dans une appli web, en code inline, donc j'ai pas besoin de mettre le handle, j'appelle la fonction dans le code html.

    Pour la variable isError, oui c'est bien un string, et non un boolean, j'avoue que le nom de la variable est mal choisi, mais elle a du changer de type entre temps :p

    Sinon oui c'est un code crade, mais j'ai pas cherché à optimiser le truc, si quelqu'un a une version optimisé et en application winforms plus commentaire, je met à jour la source :)

    JE rajouterais des commentaires à l'occase ...

  • signaler à un administrateur
    Commentaire de GeorgesDeLajungle le 05/04/2006 10:14:47

    Afin de créer des archives en conservant l'arborescences des dossiers on peut aussi utiliser la fonction intégrée à la dll : FastZip
    on déclare

    Dim zippage As New icsharpcode.SharpZipLib.Zip.FastZip
    zippage.createemptydirectories = True
    zippage.CreateZip(nomcompletfichierzip,nomrepertoire,True,"","")

    Voila voila ...;)

  • signaler à un administrateur
    Commentaire de wlad952 le 04/04/2008 11:40:23 8/10

    Merci pour ce code qui fonctionne très bien !

    Cependant, je recherche un moyen, de proposer à l'utilisateur où il souhaite stocker son fichier une fois zippé (tout comme Word lorsqu'on clique sur "Sauvegarder sous").

    Pourriez vous m'aider ?

    Merci

  • signaler à un administrateur
    Commentaire de Renfield le 04/04/2008 12:09:16 administrateur CS

    c'est un SaveFileDialog je crois, sous .Net

  • signaler à un administrateur
    Commentaire de wlad952 le 04/04/2008 12:16:37

    Cette classe est-elle disponible sous le framework 2.0 ? Car je travail dessus.

  • signaler à un administrateur
    Commentaire de Renfield le 04/04/2008 12:20:21 administrateur CS

    Si tu travailles dessus, tu n'as qu'a regarder, c'est plus simple, non ?

    là, je viens de lancer VB2005
    j'affiche ma Boîte a outils
    j'ouvre "Boîtes de dialogue"
    je vois bel et bien "SaveFileDialog"


  • signaler à un administrateur
    Commentaire de wlad952 le 04/04/2008 14:21:24

    J'ai VS2k5 également : pas de trace de "SaveFileDialog" dans ma "ToolBox"...

  • signaler à un administrateur
    Commentaire de Renfield le 04/04/2008 14:32:21 administrateur CS

    étrange, peut etre est-ce masqué...

    Bouton droit dans cette boite a outils > Choisir les elements > SafeFileDialog

  • signaler à un administrateur
    Commentaire de wlad952 le 04/04/2008 14:34:32

    Ok, je viens de comprendre pourquoi : je travail sur un projet Web Application et non Windows Application ... C'est vrai que j'avais oublié de préciser que je travaillais sur un site web.

    Cela change quelque chose à la donne ?

  • signaler à un administrateur
    Commentaire de Renfield le 04/04/2008 14:38:41 administrateur CS

    pour sur, ca change tout  ^^
    ok, donc faut provoquer un téléchargement.... je connais pas en détail, faut qu'un .Netiens Web passes dans le coin

  • signaler à un administrateur
    Commentaire de wlad952 le 04/04/2008 14:39:39

    Okay ^^ merci tout de même pour le coup de pouce ;)

  • signaler à un administrateur
    Commentaire de jesusonline le 05/04/2008 01:39:10 administrateur CS

    Response.ContentType = "application/octet-stream";
    Response.AddHeader("Content-Disposition", "attachment;filename=pouet.pdf");

    Et je crois qu'on peut aussi faire un
    Response.AddHeader("Content-Length", 1000);  // avec la bonne taille du fichier

    Ensuite faut envoyer le zip dans le stream de la réponse.

  • signaler à un administrateur
    Commentaire de wlad952 le 05/04/2008 10:04:09

    J'ai déjà mis ces lignes de codes mais sans le " Ensuite faut envoyer le zip dans le stream de la réponse.".

    Comment se traduit cette phrase en C# ?

  • signaler à un administrateur
    Commentaire de wlad952 le 07/04/2008 10:19:50

    Alors voilà ce que j'ai trouvé sur le net :

                Response.Clear();
                Response.ContentType = "application/octet-stream";
                Response.AddHeader("Content-Disposition", "attachment; filename=" + fileName);
                Response.TransmitFile(path);
                ftp.Get(Response.OutputStream, (Server.MapPath("temp/") + fileName));

    Tout cela passe correctement en mode débuggage.
    Malheureusement, après j'ai une belle erreur PageRequestManagerParseErrorException.

    " The message received from the server could not be parsed. Common causes for this error are when the response is modified by calls to Response.Write(), response filters, HttpModules, or server trace is enabled.
    Details : error parsing near 'PKCarréCarré-' "

    Je n'y comprend strictement rien ! J'utilise un UpdatePanel, cela vient peut être de la ???

    Help ...

  • signaler à un administrateur
    Commentaire de jesusonline le 08/04/2008 01:40:04 administrateur CS

    On ne peux pas modifier la response d'un UpdatePanel.

    http://blogs.developpeur.org/cyril/archive/2007/05/13/updatepanel-et-pagerequestmanagerparsererrorexception.aspx

  • signaler à un administrateur
    Commentaire de wlad952 le 08/04/2008 09:14:30

    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

  • signaler à un administrateur
    Commentaire de wlad952 le 08/04/2008 10:04:25

    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

  • signaler à un administrateur
    Commentaire de Renfield le 08/04/2008 10:09:24 administrateur CS

    "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

  • signaler à un administrateur
    Commentaire de wlad952 le 08/04/2008 10:18:13

    Merci ^^

    Et merci à tous pour votre aide !

    A bientôt je pense ... :D

Ajouter un commentaire

Pub



Appels d'offres

CalendriCode

Juillet 2008
LMMJVSD
 123456
78910111213
14151617181920
21222324252627
28293031   

Boutique

Boutique de goodies CodeS-SourceS