IdentifiantMot de passe
Loading...
Mot de passe oublié ?Je m'inscris ! (gratuit)
Navigation

Inscrivez-vous gratuitement
pour pouvoir participer, suivre les réponses en temps réel, voter pour les messages, poser vos propres questions et recevoir la newsletter

Windows Forms Discussion :

[Débutant][C#] Compression de dossier de manière récurssive


Sujet :

Windows Forms

  1. #1
    Membre à l'essai
    Profil pro
    Inscrit en
    Août 2004
    Messages
    20
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Août 2004
    Messages : 20
    Points : 17
    Points
    17
    Par défaut [Débutant][C#] Compression de dossier de manière récurssive
    Salut,

    IDE: VS.NET 2003
    FrameWork: 1.1
    Langage: C#

    Je suis pas payé pour faire ce que je fais, je le fais sur mon temps libre et par passion (histoire que l'on cerne un minimum le personnage ) et je suis plus infographiste que programmeur bien que j'ai des bases dans plusieurs languages différents (malheureusement pas de trop en C#).

    Problème: Je veux compresser le contenu d'un dossier (incluant tous les fichiers, les sous-dossiers et ce qu'ils contiennent) au format "zip" en mode "store" ou tout du moins la compression la plus faible et rapide (pas Gzip ou Bzip2 car il me faut le même format que celui utilisé pour compresser les ressources de Farcry, de Doom 3 ou de Blitzkrieg Burning Horizon). Le but final est de réaliser un "installer" pour un jeu tournant avec un moteur 3d gérant les fichiers ressources comme les moteurs des jeux cités ci-dessus. Je dispose de plusieurs dossiers contenants les fichiers nécessaire au chargement "des maps" (1 dossier par map). Lors de la compression, l'archive zip doit servir de dossier, je m'explique: j'ai un dossier "DossierBase" qui contient plusieurs fichiers et plusieurs sous-dossiers qui contienent eux aussi des fichiers et sous-dossiers. Je veux obtenir une archive nommé "DossierBase" mais qui contienne directement les fichiers et dossiers. Donc je ne retrouve pas de dossier nommé DossierBase" dans l'archive. Cependant je veux garder la hiérarchie des dossiers à l'intérieur! Pour prendre un exemple concret (réservé au utilisateurs de windobe ... pardon windows possédant winrar) l'action qu'il faudrait effectuer serais la suivante: ouvrir les dossier "DossierBase", ctrl+a, clique droit sur un fichier puis [Add to "DossierBase.rar"] sauf qu'il faudrait respecté les contrainte de format de compression cités plus haut.
    J'espère ne pas trop vous avoir embrouillé jusque là
    Je tiens aussi à précisé que j'auré aussi à me servir de cette fonction pour l'éditeur de carte (une classe est donc la meilleur solution je supose).
    Je pense que la description du pb est à peu près complette, si cela manque de précision faut pas hésiter à me le dire

    Question: Quel sont les solutions à ma dispositions ? (Je sais obtenir les chemins absolu de tous mes fichiers et dossiers dans un ArrayList)

    J'ai pensé à SharpZipLib mais dans ce cas il me faudrait une breve explication du principe de fonctionnement de la librairie et une description plus apronfondi des fonctions, classes, méthodes et propriétées dont je devrai user. Une petite piste concernant "l'algorythme" de ma fonction (je supose qu'un peu de récursivité devrai faire l'affaire mais si je me trompe je suis tout ouvert à d'autre solutions !)

    J'ai aussi penser utiliser un logiciel externe: un standalone pas trop lourd genre "7za" (Seven Zip) mais qui fonctionne ! (c'était là le pb avec ce soft!)
    Mon application n'a pas de but commerciale donc pas de pb de liscence (enfin un point positif )

    J'ai aussi pensé à essayer d'utiliser la fonction de "dossier zippé" de windows Me/XP mais cela restreint trop la plate forme d'accueille et doit etre difficilement exploitable ... c'était tout de meme une idée.

    Je vous remercie donc d'avance de toute aide que vous pourrez m'apporter !

    LP

  2. #2
    Rédacteur
    Avatar de Thomas Lebrun
    Profil pro
    Inscrit en
    Octobre 2002
    Messages
    9 161
    Détails du profil
    Informations personnelles :
    Âge : 41
    Localisation : France

    Informations forums :
    Inscription : Octobre 2002
    Messages : 9 161
    Points : 19 434
    Points
    19 434
    Par défaut
    Bon, je te fais un truc rapide avec SharZiplib, pour que tu comprennes le principe (Attention, j'ai pas VS sous la main....)

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
    14
    15
    16
    17
    18
    19
    20
    21
    22
    23
    24
    25
    26
    27
    28
    29
    30
    31
    32
    33
     
    string [] files = Directory.GetFiles(repertoire_cible);
    string ZipName = "Toto.zip";
     
    					// Flux qui va créer l'archive 
    					ZipOutputStream ZipStream = new ZipOutputStream(File.Create(ZipName));
     
    					// On indique le niveau d ecompression
    					// 0 -> Compression minimale
    					// 9 -> Compression maximale
    					ZipStream.SetLevel(0);
     
    					// Pour chaque fichier 
    					foreach( string file in files )
    					{
    						// On récupère le chemin + nom du fichier
    						string file_tozip = file;
     
    						// Stream qui va lire le fichier
    						FileStream fs = File.OpenRead(file_tozip);            			
    						// Tableau de byte, de la taille du fichier à lire
    						byte[] buffer = new byte[fs.Length];
    						// Lecture
    						fs.Read(buffer, 0, buffer.Length);
    						// On 	crée une nouvelle entrée dans l'archive
    						ZipEntry entry = new ZipEntry(Path.GetFileName(file_tozip));
    						// On ajoute la nouvelle entrée
    						ZipStream.PutNextEntry(entry);
    						ZipStream.Write(buffer, 0, buffer.Length);            			
    					}
    					// On ferme le flux
    					ZipStream.Finish();
    					ZipStream.Close();

  3. #3
    Membre à l'essai
    Profil pro
    Inscrit en
    Août 2004
    Messages
    20
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Août 2004
    Messages : 20
    Points : 17
    Points
    17
    Par défaut
    OK Super! merci beaucoup !
    Je comprend mieux la chose et une lègère adaptation résoudra mon pb.
    VS ou pas c'est pas grave car c'est toujours du C# et j'arrive à saisir.
    Thx again

    LP

  4. #4
    Membre à l'essai
    Profil pro
    Inscrit en
    Août 2004
    Messages
    20
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Août 2004
    Messages : 20
    Points : 17
    Points
    17
    Par défaut
    Tu as oublié de refermer le flux de lecture du fichier à incorporer. Bon c pas très grave si on touche plus au fichier après, mais ça m'a posé pb parce que je devais le supprimer. Donc voila le code retouché:
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
    14
    15
    16
    17
    18
    19
    20
    21
    22
    23
    24
    25
    26
    27
    28
    29
    30
    31
    32
    33
    34
    35
    36
    37
    38
     
     
    string [] files = Directory.GetFiles(repertoire_cible); 
    string ZipName = "Toto.zip"; 
     
                   // Flux qui va créer l'archive 
                   ZipOutputStream ZipStream = new ZipOutputStream(File.Create(ZipName)); 
     
                   // On indique le niveau d ecompression 
                   // 0 -> Compression minimale 
                   // 9 -> Compression maximale 
                   ZipStream.SetLevel(0); 
     
                   // Pour chaque fichier 
                   foreach( string file in files ) 
                   { 
                      // On récupère le chemin + nom du fichier 
                      string file_tozip = file; 
     
                      // Stream qui va lire le fichier 
                      FileStream fs = File.OpenRead(file_tozip);                      
                      // Tableau de byte, de la taille du fichier à lire 
                      byte[] buffer = new byte[fs.Length]; 
                      // Lecture 
                      fs.Read(buffer, 0, buffer.Length); 
                      // On    crée une nouvelle entrée dans l'archive 
                      ZipEntry entry = new ZipEntry(Path.GetFileName(file_tozip)); 
                      // On ajoute la nouvelle entrée 
                      ZipStream.PutNextEntry(entry); 
                      ZipStream.Write(buffer, 0, buffer.Length);
     
                      //On ferme le flux de lecture
                      fs.close();
     
                   } 
                   // On ferme le flux 
                   ZipStream.Finish(); 
                   ZipStream.Close();

  5. #5
    Nouveau Candidat au Club
    Profil pro
    Inscrit en
    Juin 2007
    Messages
    1
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Juin 2007
    Messages : 1
    Points : 1
    Points
    1
    Par défaut L'opération arithmétique a provoqué un dépassement de capacité.
    Bonjour à tous,
    Quand j'utilise ce code, au moment de créer le fichier zip un message d'erreur s'affiche:
    Une exeption non gérée s'est produite dans votre application. Si vous
    cliquez sur Continuer, l'application ignore cette erreur et essaie de
    continuer. Si vous clicquez sur Quitter, L'application s'arrête
    immédiatement.

    L'opération arithmétique a provoqué un dépassement de capacité.

    Détails:

    Consultez la fin de ce message pour plus de détails sur l'appel du débogage
    juste-à-temps (JIT) à la place de cette boîte de dialogue.

    ************** Texte de l'exception **************
    System.OverflowException: L'opération arithmétique a provoqué un dépassement de capacité.
    à ICSharpCode.SharpZipLib.Zip.ZipOutputStream.CloseEntry() dans c:\CodesSources\SharpZipLib\Zip\ZipOutputStream.cs:ligne 497
    à ICSharpCode.SharpZipLib.Zip.ZipOutputStream.PutNextEntry(ZipEntry entry) dans c:\CodesSources\SharpZipLib\Zip\ZipOutputStream.cs:ligne 259
    à KilovSkinCreator.MainForm.ExportSkinClick(Object sender, EventArgs e) dans c:\CodesSources\MonApplication\MainForm.cs:ligne 1324 //corespond à la ligne : ZipStream.PutNextEntry(entry);
    à System.Windows.Forms.Control.OnClick(EventArgs e)
    à System.Windows.Forms.Button.OnClick(EventArgs e)
    à System.Windows.Forms.Button.OnMouseUp(MouseEventArgs mevent)
    à System.Windows.Forms.Control.WmMouseUp(Message& m, MouseButtons button, Int32 clicks)
    à System.Windows.Forms.Control.WndProc(Message& m)
    à System.Windows.Forms.ButtonBase.WndProc(Message& m)
    à System.Windows.Forms.Button.WndProc(Message& m)
    à System.Windows.Forms.Control.ControlNativeWindow.OnMessage(Message& m)
    à System.Windows.Forms.Control.ControlNativeWindow.WndProc(Message& m)
    à System.Windows.Forms.NativeWindow.Callback(IntPtr hWnd, Int32 msg, IntPtr wparam, IntPtr lparam)
    ...
    Quelqu'un pourait-il m'aider?

  6. #6
    Candidat au Club
    Profil pro
    Inscrit en
    Mai 2006
    Messages
    2
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Mai 2006
    Messages : 2
    Points : 2
    Points
    2
    Par défaut
    Bonjour,

    J'utilise le morceau de code que tu as donné, il fonctionne bien pour zipper des fichiers. Par contre, je n'arrive pas à les dezipper avec Winzip ou Winrar. Dans l'archive, les fichiers ont tous la même taille, elle correspond à la taille du fichier zip lui même. Est ce que vous avez une idée d'où peut venir mon problème ?

    Merci.

  7. #7
    Membre à l'essai
    Profil pro
    Inscrit en
    Juin 2005
    Messages
    15
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Juin 2005
    Messages : 15
    Points : 11
    Points
    11
    Par défaut
    J'ai le même probleme ... impossible à dézipper avec winrar /winzip ...

    Winrar me dit (je l'ai devant moi ..) :

    d:\toto\tata.zip: Méthode inconnue dans ( et rien de plus on saura pas dans quoi !lol)
    d:\toto\tata.zip: Pas de fichier à extraire....

    De la même manière, l'outil systeme de décompression sur XP parvient à parser le zip, mais pas à le décompresser ....

    Par contre avec 7zip, ca fonctionne très bien ... on peut sans pb dézipper ...

    Vraisemblablement, il y aurait (notez le conditionnel ...) un soucis dans le format/methode d'encodage du stream de zip .... qui fait que des applis telles que winrar/zip/XP ne connaissent pas.

    Ou bien serait-ce un confilt commercial/opensource ?????

    Ou bien soucis de multi plateforme .... cela semble etre concu pour plusieurs OS ... y aurait-il des soucis identiques sous linux/OSX (mono)

    Ou bien l'exemple n'est-il pas suffisamment developpé ?? ....

    bref ....

    si qqun a de plus amples info,

    merci

  8. #8
    Candidat au Club
    Profil pro
    Inscrit en
    Mai 2006
    Messages
    2
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Mai 2006
    Messages : 2
    Points : 2
    Points
    2
    Par défaut
    J'ai résolu le problème en faisant un Tar des fichiers puis un GZip. Le fichier résultat peut être décompressé par winrar ou winzip. Je n'ai pas trouvé de solution pour faire directement un fichier Zip avec la librairie.

  9. #9
    Nouveau Candidat au Club
    Profil pro
    Inscrit en
    Juin 2009
    Messages
    1
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Juin 2009
    Messages : 1
    Points : 1
    Points
    1
    Par défaut
    Bonjour, j'ai utiliser votre code, et malheureusement le dossier zipé n'est pas crée à la fin, mais le code ne me génère aucune erreur si vous avez une explication merci par avance

  10. #10
    Membre du Club
    Profil pro
    Inscrit en
    Juin 2009
    Messages
    111
    Détails du profil
    Informations personnelles :
    Localisation : France, Paris (Île de France)

    Informations forums :
    Inscription : Juin 2009
    Messages : 111
    Points : 65
    Points
    65
    Par défaut
    Bonjour,

    Est ce que vous avez une idée sur comment décompresser le zip généré ?

  11. #11
    Membre du Club
    Inscrit en
    Janvier 2007
    Messages
    63
    Détails du profil
    Informations forums :
    Inscription : Janvier 2007
    Messages : 63
    Points : 48
    Points
    48
    Par défaut
    Pardonnez-moi de resortir un vieux topic mais personne n'a réellement répondu à comment faire pour que le zip créé soit lisible avec winzip.

    J'utilse SharpZipLib, il me crée bien mon zip avec les bons fichiers dedans, mais lorsque j'essaye de le dézipper avec l'utilitaire windows il me dit "Le dossier compressé n'est pas valide ou est endommagé".
    De plus, si je double clic sur le Zip, il s'ouvre avec 7zip mais je ne peux pas ouvrir le fichier à la volé, je suis obligé de faire clic droit extract here et ouvrir le fichier dézippé !

    Pourriez-vous m'indiquer une solution

    Merci

    [edit]
    J'ai trouvé une solution pour que l'explorateur windows permette l'ouverture du fichier, ainsi que l'ouverture à la volé;
    Il faut ajouter à notre ZipOutputStream la condition ne pas utiliser le Zip64

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    // Flux qui va créer l'archive 
    ZipOutputStream ZipStream = new ZipOutputStream(File.Create(zipName));
     
    // Permet l'ouverture du zip avec l'extracteur windows
    ZipStream.UseZip64 = UseZip64.Off;
    Mais est-ce la méthode la plus efficace ?

    [/edit]

+ Répondre à la discussion
Cette discussion est résolue.

Discussions similaires

  1. Compression de dossiers avec Abbrevia
    Par Badrouta dans le forum Delphi
    Réponses: 4
    Dernier message: 27/01/2007, 08h45
  2. [Windows] Compresser un dossier en .tgz
    Par Nicotendo dans le forum Autres Logiciels
    Réponses: 6
    Dernier message: 18/12/2006, 13h15
  3. Compresser un dossier avec Compress::Zlib
    Par mobscene dans le forum Modules
    Réponses: 1
    Dernier message: 17/11/2006, 21h13
  4. compresser un dossier
    Par kevain_09 dans le forum VBScript
    Réponses: 3
    Dernier message: 07/09/2006, 18h21
  5. [Débutant]Comment partager un dossier et limiter son accès
    Par digital prophecy dans le forum Windows XP
    Réponses: 4
    Dernier message: 20/01/2006, 15h44

Partager

Partager
  • Envoyer la discussion sur Viadeo
  • Envoyer la discussion sur Twitter
  • Envoyer la discussion sur Google
  • Envoyer la discussion sur Facebook
  • Envoyer la discussion sur Digg
  • Envoyer la discussion sur Delicious
  • Envoyer la discussion sur MySpace
  • Envoyer la discussion sur Yahoo