Comprimant / Décompression dossiers et des fichiers

voix
42

Est-ce que quelqu'un sait d'un bon moyen pour compresser ou décompresser des fichiers et des dossiers en C # rapidement? Manipulation des fichiers volumineux peut être nécessaire.

Créé 01/08/2008 à 18:13
source utilisateur
Dans d'autres langues...                            


9 réponses

voix
24

L'espace de noms .NET Framework 2.0 System.IO.Compressionprend en charge les algorithmes gzip et deflate. Voici deux méthodes qui compressent et décompressent un flux d'octets que vous pouvez obtenir à partir de votre fichier objet. Vous pouvez subsitute GZipStreampour DefaultStreamles méthodes ci - dessous pour utiliser cet algorithme. Cela laisse encore le problème de la gestion des fichiers compressés avec des algorithmes différents cependant.

public static byte[] Compress(byte[] data)
{
    MemoryStream output = new MemoryStream();

    GZipStream gzip = new GZipStream(output, CompressionMode.Compress, true);
    gzip.Write(data, 0, data.Length);
    gzip.Close();

    return output.ToArray();
}

public static byte[] Decompress(byte[] data)
{
    MemoryStream input = new MemoryStream();
    input.Write(data, 0, data.Length);
    input.Position = 0;

    GZipStream gzip = new GZipStream(input, CompressionMode.Decompress, true);

    MemoryStream output = new MemoryStream();

    byte[] buff = new byte[64];
    int read = -1;

    read = gzip.Read(buff, 0, buff.Length);

    while (read > 0)
    {
        output.Write(buff, 0, read);
        read = gzip.Read(buff, 0, buff.Length);
    }

    gzip.Close();

    return output.ToArray();
}
Créé 05/08/2008 à 13:04
source utilisateur

voix
21

Je l'ai toujours utilisé la bibliothèque SharpZip.

Voici un lien

Créé 01/08/2008 à 18:30
source utilisateur

voix
10

A partir de .Net 1.1 la seule méthode disponible atteint dans les bibliothèques Java.
Utilisation des classes Zip dans les J # bibliothèques de classes pour compresser les fichiers et données avec C #
Je ne sais pas si cela a changé dans les versions récentes.

Créé 01/08/2008 à 18:28
source utilisateur

voix
8

Ma réponse serait fermer les yeux et opter pour DotNetZip . Il a été testé par une grande communauté.

Créé 17/11/2013 à 17:08
source utilisateur

voix
8

Vous pouvez utiliser une bibliothèque 3ème partie, comme SharpZip que Tom a fait remarquer.

Une autre façon (sans passer 3ème partie) est d'utiliser l'API Windows Shell. Vous devrez définir une référence aux contrôles Microsoft Shell et automatisation des bibliothèques COM dans votre projet C #. Gerald Gibson a un exemple à:

http://geraldgibson.net/dnn/Home/CZipFileCompression/tabid/148/Default.aspx

La copie d'Internet Archive de la page morte

Créé 01/08/2008 à 19:04
source utilisateur

voix
6

GZipStream est un très bon utilitaire pour utiliser.

Créé 13/05/2012 à 03:01
source utilisateur

voix
6

Ceci est très facile à faire en java, et comme indiqué ci-dessus, vous pouvez rejoindre dans les bibliothèques java.util.zip de C #. Pour les références, voir:

java.util.zip de
code d'échantillon

J'ai utilisé ce tout à l'heure de faire un zip profond (récursive) d'une structure de dossiers, mais je ne pense pas que j'ai jamais utilisé le dézipper. Si je suis tellement motivé que je puisse tirer de ce code et à le modifier en ici plus tard.

Créé 05/08/2008 à 00:52
source utilisateur

voix
5

Une autre bonne alternative est également DotNetZip .

Créé 08/12/2011 à 23:29
source utilisateur

voix
0

vous pouvez créer un fichier zip avec cette méthode:

public async Task<string> CreateZipFile(string sourceDirectoryPath, string name)
    {
        var path = HostingEnvironment.MapPath(TempPath) + name;
        await Task.Run(() =>
        {
            if (File.Exists(path)) File.Delete(path);
            ZipFile.CreateFromDirectory(sourceDirectoryPath, path);
        });
        return path;
    }

et vous pouvez décompressez le fichier zip avec ces méthodes:
1- cette méthode de travail avec le chemin de fichier zip

public async Task ExtractZipFile(string filePath, string destinationDirectoryName)
    {
        await Task.Run(() =>
        {
            var archive = ZipFile.Open(filePath, ZipArchiveMode.Read);
            foreach (var entry in archive.Entries)
            {
                entry.ExtractToFile(Path.Combine(destinationDirectoryName, entry.FullName), true);
            }
            archive.Dispose();
        });
    }

2- cette méthode de travail avec flux de fichier zip

public async Task ExtractZipFile(Stream zipFile, string destinationDirectoryName)
    {
        string filePath = HostingEnvironment.MapPath(TempPath) + Utility.GetRandomNumber(1, int.MaxValue);
        using (FileStream output = new FileStream(filePath, FileMode.Create))
        {
            await zipFile.CopyToAsync(output);
        }
        await Task.Run(() => ZipFile.ExtractToDirectory(filePath, destinationDirectoryName));
        await Task.Run(() => File.Delete(filePath));
    }
Créé 09/01/2018 à 18:35
source utilisateur

Cookies help us deliver our services. By using our services, you agree to our use of cookies. Learn more