begin process at 2010 03 22 00:53:29
  Trouver un code source :
 
dans
 
Accueil > Forum > 

C#

 > 

Algorithme

 > 

Compression, Split et Cryptage

 > 

Zip récursif


Derniers messages déposésPoser une question dans le forum ou lancer une discussion

Zip récursif

mardi 9 septembre 2008 à 15:40:25 | Zip récursif

bmouget

Bonjour,

J'utilise SharpZip pour compresser un répertoire dans un fichier Zip.
Les fichiers du dossier sont bien compressés mais je voudrais compresser également tous les dossiers et fichiers récursifs.

Une idée ?

Merci.

Code :


        public static void Zip(string FolderName, string ZipFileName)
        {
            try
            {
                // Depending on the directory this could be very large and would require more attention
                // in a commercial package.
                string[] filenames = Directory.GetFiles(FolderName);

                // 'using' statements gaurantee the stream is closed properly which is a big source
                // of problems otherwise.  Its exception safe as well which is great.
                using (ZipOutputStream s = new ZipOutputStream(File.Create(ZipFileName)))
                {

                    s.SetLevel(6); // 0 - store only to 9 - means best compression

                    byte[] buffer = new byte[4096];

                    foreach (string file in filenames)
                    {

                        // Using GetFileName makes the result compatible with XP
                        // as the resulting path is not absolute.
                        ZipEntry entry = new ZipEntry(Path.GetFileName(file));

                        // Setup the entry data as required.

                        // Crc and size are handled by the library for seakable streams
                        // so no need to do them here.

                        // Could also use the last write time or similar for the file.
                        entry.DateTime = DateTime.Now;
                        s.PutNextEntry(entry);

                        using (FileStream fs = File.OpenRead(file))
                        {

                            // Using a fixed size buffer here makes no noticeable difference for output
                            // but keeps a lid on memory usage.
                            int sourceBytes;
                            do
                            {
                                sourceBytes = fs.Read(buffer, 0, buffer.Length);
                                s.Write(buffer, 0, sourceBytes);
                            } while (sourceBytes > 0);
                        }
                    }


                    // Finish/Close arent needed strictly as the using statement does this automatically

                    // Finish is important to ensure trailing information for a Zip file is appended.  Without this
                    // the created file would be invalid.
                    s.Finish();

                    // Close is important to wrap things up and unlock the file.
                    s.Close();
                }
            }
            catch (Exception ex)
            {
                Console.WriteLine("Exception during processing {0}", ex);

                // No need to rethrow the exception as for our purposes its handled.
            }
        }

mardi 9 septembre 2008 à 16:07:57 | Re : Zip récursif

bmouget

Réponse acceptée !

Ok c'est bon j'ai trouvé, c'est tout bête.

Pour ceux à qui cela intéresse, voici le code :


        public static void Zip(string FolderName, string ZipFileName)
        {
            try
            {

                // 'using' statements gaurantee the stream is closed properly which is a big source
                // of problems otherwise.  Its exception safe as well which is great.
                using (ZipOutputStream s = new ZipOutputStream(File.Create(ZipFileName)))
                {
                    s.SetLevel(6); // 0 - store only to 9 - means best compression

                    ZipRecusive(s, FolderName, "");

                    s.Finish();

                    s.Close();
                }
            }
            catch (Exception ex)
            {
                Console.WriteLine("Exception during processing {0}", ex);

                // No need to rethrow the exception as for our purposes its handled.
            }
        }

        private static void ZipRecusive(ZipOutputStream s, string FolderName, string RecursivePath)
        {
            // 1 Fichier
            string[] filenames = Directory.GetFiles(FolderName + RecursivePath);
            foreach (string file in filenames)
            {
                ZipEntry entry = new ZipEntry(RecursivePath + Path.GetFileName(file));

                // Could also use the last write time or similar for the file.
                entry.DateTime = DateTime.Now;
                s.PutNextEntry(entry);

                using (FileStream fs = File.OpenRead(file))
                {
                    byte[] buffer = new byte[4096];
                    // Using a fixed size buffer here makes no noticeable difference for output
                    // but keeps a lid on memory usage.
                    int sourceBytes;
                    do
                    {
                        sourceBytes = fs.Read(buffer, 0, buffer.Length);
                        s.Write(buffer, 0, sourceBytes);
                    } while (sourceBytes > 0);
                }
            }

            // 2 Répertoires
            string[] directorynames = Directory.GetDirectories(FolderName + RecursivePath);
            foreach (string directory in directorynames)
            {
                ZipRecusive(s, FolderName, directory.Substring(FolderName.Length)+@"\");
            }
        }

dimanche 14 septembre 2008 à 10:27:57 | Re : Zip récursif

Bidou

Administrateur CodeS-SourceS
Bonjour, Je ne connais pas bien cette librairie mais le framework possède aussi des possibilités de compressions dans System.IO.Compression. C'est parfois mieux que de rajouter une nouvelle dépendance sur une librairie externe...
lundi 15 septembre 2008 à 09:11:02 | Re : Zip récursif

bmouget

Bonjour,

As-tu un exemple de code utilisant System.IO.Compression à me proposer ?

Merci.
lundi 15 septembre 2008 à 09:40:45 | Re : Zip récursif

Bidou

Administrateur CodeS-SourceS
Page principale MSDN: http://msdn.microsoft.com/en-us/library/system.io.compression.aspx
Exemple MSDN (gzipstream): http://msdn.microsoft.com/en-us/library/system.io.compression.gzipstream.aspx
Blog MSDN: [ Lien ]




-My Blog-
lundi 15 septembre 2008 à 10:14:46 | Re : Zip récursif

bmouget

Pas mal, mais j'avais déjà vu que l'on ne pouvait compressé qu'un seul fichier pour une archive zip.
As-tu une idée de comment ajouter un répertoire complet (fichier, sous-répertoire, ...) à l'archive ?
Ton 3éme lien est bien mais je suis obligé de rajouter aussi une dépendance externe.

Merci.
jeudi 20 novembre 2008 à 11:14:20 | Re : Zip récursif

maloups

Bonjour à tous !

J'ai egalement du passer par la problèmatique de Zipper un repertoire en Java ainsi que tous ces sous répertoires.
M. Google m'a très rapidement redirigé vers codeSource

J'avoue que le principe de cet algo m'a bien aidé, mais avait kan meme deux gros inconvénient !
- L'utilisation de librairie spécifique alors que les lib java de base font aussi bien
- Ce bout de code ne fonctionne qu'à partir de Java 1.5 (et oui, y'en a qui travail encore avec de plus vieille version de java )

Voici la version remasterisé, qui fonctionne avec Java 1.4 (pas testé avec les versions antérieur), et qui ne nécéssite aucune librairie complémentaire !

[CODE]
import java.io.BufferedInputStream;
import java.io.BufferedOutputStream;
import java.io.File;
import java.io.FileInputStream;
import java.io.FileOutputStream;
import java.io.IOException;
import java.util.ArrayList;
import java.util.zip.ZipEntry;
import java.util.zip.ZipOutputStream;

public class testZipRecursif {
    static final int BUFFER = 2048;
   
    /**
     * Zip un répertoire en modifiant le niveau de compression
     * @param args
     */
    public static void main(String[] args) {
        //Declaration du repertoire à zipper (linux version)
        //String REP_A_ZIPPER = "//var//testZip//AZipper//";
        //Declaration du repertoire à zipper (windows version)
        String REP_A_ZIPPER = "\\var\\testZip\\AZipper\\";

         //Declaration du fichier final (linux version)
        //String ZIP_FILE = "//var//testZip//myfigsLevel.zip";
        //Declaration du fichier final (windows version)
        String ZIP_FILE = "\\var\\testZip\\myfigsLevel.zip";
       
        //Declaration du niveau de compression
        int zipLevel = 0;
       
        //Zip recursif d'un repertoire
        zipRepertoire(REP_A_ZIPPER, ZIP_FILE, zipLevel);
    }

   
    /**
     * Zip recursivement le contenu d'un repertoire
     * @param REP_A_ZIPPER Le repertoire en entree
     * @param ZIP_FILE Le fichier de sortie
     * @param zipLevel Le niveau de compression
     */
    private static void zipRepertoire(String REP_A_ZIPPER, String ZIP_FILE, int zipLevel){
        try {
            //Creation du fichier final
            FileOutputStream dest = new
              FileOutputStream(ZIP_FILE);
            ZipOutputStream out = new ZipOutputStream(new
              BufferedOutputStream(dest));
           
            //On definit le niveau de compression
            out.setLevel(zipLevel);
           
            //On zip recursivement le contenu d'un repertoire
            //Ainsi que de ses sous repertoires
            ZipRecusive(out, REP_A_ZIPPER, "");
           
            out.close();
         } catch(IOException e) {
            e.printStackTrace();
         }
    }
   
    /**
     * Permet de traiter recursivement le contenu d'un repertoire
     * @param out Le flux zip de sortie
     * @param REP_A_ZIPPER Le repertoire de base à zipper
     * @param RecursivePath Le sous repertoire que l'on traite
     */
    private static void ZipRecusive(ZipOutputStream out, String REP_A_ZIPPER, String RecursivePath){
        byte data[] = new byte[BUFFER];
        //Creatin de la liste des fichiers present dans un repertoire
        File f = new File(REP_A_ZIPPER+RecursivePath);
        String files[] = f.list();
        BufferedInputStream origin = null;
        ArrayList listDirectory = new ArrayList();
        try{
            //On parcourt la liste des fichiers du repertoire
            for (int i=0; i<files.length; i++) {
                //On recupere le nom du fichier
                String fileName = files[i];
                //On reconstruit le chemin complet du fichier
                String pathAndFile = REP_A_ZIPPER+RecursivePath+fileName;
                //On cherche a savoir si il s'agit un repertoir ou d'un fichier
                File fileTmp = new File(pathAndFile);
                //Si il s'agit d'un repertoire,
                //on l'ajoute dans une liste de repertoire à traiter
                if (fileTmp.isDirectory()){
                    listDirectory.add(fileName);
                } else {
                   //Traitement du fichier courant
                   FileInputStream fi = new
                     FileInputStream(pathAndFile);
                   origin = new
                     BufferedInputStream(fi, BUFFER);
                   //Debut du zipage du fichier courant
                   ZipEntry entry = new ZipEntry(RecursivePath+fileName);
                   out.putNextEntry(entry);
                   int count;
                   while((count = origin.read(data, 0,
                     BUFFER)) != -1) {
                      out.write(data, 0, count);
                   }
                   origin.close();
                }
            }
           
            //Parcours de la liste des répertoires present dans le repertoire courant
            String[] directoriesName = convertArrayListToStringTab(listDirectory);
            for (int i=0; i<directoriesName.length; i++) {
                String directory = directoriesName[i];
                ZipRecusive(out, REP_A_ZIPPER, directory+"\\");
            }
         } catch(IOException e) {
            e.printStackTrace();
         }
    }
   
    /**
     * Convertir un ArrayList en String[]
     * @return un tableau de chaine de caractère
     */
    private static String[] convertArrayListToStringTab(ArrayList list){
        String[] res = new String[list.size()];
       
        for (int i=0; i<list.size(); i++){
            res[i] = list.get(i).toString();
        }
       
        return res;
    }
}

[/CODE]


Voili voilou !
jeudi 20 novembre 2008 à 11:19:03 | Re : Zip récursif

maloups

Lol, j'ai pas trouvé comment modifier mon poste... un peu a la rue moi
Pas vu qu'on etait dans un section CSharp... faut avouer que ca ressemble beaucoup à du java
En tout, cas, etant donnée les similitudes, je pense qu'il y aura toujours moy de s'y retrouver
jeudi 20 novembre 2008 à 12:13:27 | Re : Zip récursif

Bidou

Administrateur CodeS-SourceS
Bonjour,
Merci de poser la question sur www.javafr.com.

Meme login et mot de passe.



-Blog-
-Site Perso-


Cette discussion est classée dans : file, to, using, is, zip


Répondre à ce message

Sujets en rapport avec ce message

Delete file c# [ par mustai ] I try to delete file wich one i had created with System.IO.File.Copy(....), i always receive an exception like i dont have the right to delete it. Th Icon to file [ par LUDINSKI ] Bonjour à tousJe cherche un moyen de sauvegarder une icône extraite d'un fichier (.exe) en un fichier .icoLa méthode Icon.Save() me crée bien le fichi impossible de déplacer un fichier après décompression [ par katwes ] Bonjour,J'utilise le code suivant pour décompresser les .zip:using java.util;using java.util.zip; erreur dans traduction via api google :"Index and length must refer to a location within the string" [ par tkd1984 ] bonjour j'ai entrain de realiser une application desktop sous c#,qui traduire n'import quelle texte entrer avec l'aide de l'api google,voici le code : how to pass XML file to my constructor C# [ par houdaprog ] Hi ;I would pass a XML file to a constructor c# to extract data from this file and to use this data.please help me; Attempted to read or write protected memory. This is often an indication that other memory is corrupt. [ par damzz ] Bonjour, J'ai créé une dll en C# (.NET 2.0 et 3.5) qui fait appel à des méthodes venant d'une librairie développée en C/C++. Cette dernière est util Problème avec les modulo [ par KoDFoX ] Bonjour, j'ai un projet a remettre bientôt et je trouve pas comment faire mon programme voici une version zip que j'ai mis sur mon serveur [url=http:/ Transmettre les données d'un a un autre form [ par Lorine ] Bonjour, J'ai un form dans lequel j'ai un menu avec * charger la base de donnée * Accès au deuxième form Et une datagridview [code=cs] using System [Linq to SQL] DataContext - Mise à jour Automatique Tables et contraintes ? [ par TeK55 ] Bonjour à tous, Est il possible de définir un DataContext qui se met à jour automatique lors qu'un des éléments qui le compose à été modifier directe


Nos sponsors


Sondage...

Comparez les prix

CalendriCode

Mars 2010
LMMJVSD
1234567
891011121314
15161718192021
22232425262728
293031    

Consulter la suite du CalendriCode

 
Développement réalisé par Nicolas SOREL (Nix) avec l'aide de : Cyril DURAND et Emmanuel (EBArtSoft), Merci à Vincent pour ses précieux conseils.
CodeS-SourceS.com© Toute reproduction même partielle est interdite sauf accord écrit du Webmaster
CodeS-SourceS.com© est une marque déposée tous droits réservés

Google Coop CodeS-SourceS Google Coop CodeS-SourceS
Temps d'éxécution de la page : 0,406 sec (3)

Nous contacter | Annoncer sur CodeS-SourceS | Mentions légales