Compresser / décompresser des dossiers et des fichiers

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

0
ajouté édité
Vues: 2

8 Réponses

C'est très facile à faire dans Java, et comme indiqué ci-dessus, vous pouvez accéder aux bibliothèques java.util.zip à partir de C #. Pour les références, voir:

java.util.zip javadocs
sample code

Je l'ai utilisé il y a un moment pour faire un zip (récursif) profond d'une structure de dossiers, mais je ne pense pas avoir jamais utilisé le décompressage. Si je suis tellement motivé, je peux sortir ce code et le modifier ici plus tard.

0
ajouté

L'espace de noms de framework .Net 2.0 System.IO.Compression supporte 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 objet fichier. Vous pouvez substituer GZipStream pour DefaultStream dans les méthodes ci-dessous pour utiliser cet algorithme. Cela laisse quand même le problème de gérer des fichiers compressés avec des algorithmes différents.

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();
}
0
ajouté

J'ai toujours utilisé la bibliothèque SharpZip.

Voici un lien

0
ajouté
Note: J'ai trouvé un bogue int overflow dans le code SharpZip il y a des années, ce qui l'a fait échouer sur des fichiers aléatoires qui avaient juste la bonne combinaison de valeurs. Je ne sais pas si cela a été corrigé, mais de mémoire j'ai changé une variable int en long dans la source SharpZip pour éviter le débordement. Je vais devoir essayer de trouver mon ancien code SharpZip fixe et vérifier si elle correspond à la dernière .
ajouté l'auteur Gone Coding, source

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

0
ajouté

GZipStream is a really good utility to use.

0
ajouté

As of .Net 1.1 the only available method is reaching into the java libraries.
Using the Zip Classes in the J# Class Libraries to Compress Files and Data with C#
Not sure if this has changed in recent versions.

0
ajouté

Une autre bonne alternative est également DotNetZip .

0
ajouté

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

public async Task 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;
    }

and then you can unzip zip file with this methods:
1- this method work with zip file path

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 fonctionne avec le 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));
    }
0
ajouté