web-dev-qa-db-fra.com

Comment compresser des fichiers

Je veux compresser un fichier et un répertoire en C #. J'ai trouvé une solution dans Internet mais elles sont si complexes et je ne pouvais pas les exécuter dans mon projet. Quelqu'un peut-il me proposer une solution claire et efficace? 

13
selentoptas

Vous pouvez utiliser GZipStream dans l'espace de noms System.IO.Compression

.NET 2.0.

public static void CompressFile(string path)
{
    FileStream sourceFile = File.OpenRead(path);
    FileStream destinationFile = File.Create(path + ".gz");

    byte[] buffer = new byte[sourceFile.Length];
    sourceFile.Read(buffer, 0, buffer.Length);

    using (GZipStream output = new GZipStream(destinationFile,
        CompressionMode.Compress))
    {
        Console.WriteLine("Compressing {0} to {1}.", sourceFile.Name,
            destinationFile.Name, false);

        output.Write(buffer, 0, buffer.Length);
    }

    // Close the files.
    sourceFile.Close();
    destinationFile.Close();
}

.NET 4

public static void Compress(FileInfo fi)
    {
        // Get the stream of the source file.
        using (FileStream inFile = fi.OpenRead())
        {
            // Prevent compressing hidden and 
            // already compressed files.
            if ((File.GetAttributes(fi.FullName) 
                & FileAttributes.Hidden)
                != FileAttributes.Hidden & fi.Extension != ".gz")
            {
                // Create the compressed file.
                using (FileStream outFile = 
                            File.Create(fi.FullName + ".gz"))
                {
                    using (GZipStream Compress = 
                        new GZipStream(outFile, 
                        CompressionMode.Compress))
                    {
                        // Copy the source file into 
                        // the compression stream.
                    inFile.CopyTo(Compress);

                        Console.WriteLine("Compressed {0} from {1} to {2} bytes.",
                            fi.Name, fi.Length.ToString(), outFile.Length.ToString());
                    }
                }
            }
        }
    }

http://msdn.Microsoft.com/en-us/library/ms404280.aspx

24
Darren

J'ajoute cette réponse car j'ai trouvé un moyen plus facile que n'importe quelle réponse existante:

  1. Installez DotNetZip DLL dans votre solution (le moyen le plus simple consiste à installer le paquet à partir de nuget)
  2. Ajouter une référence à la DLL.
  3. Importez l’espace de noms en ajoutant: using Ionic.Zip;
  4. Zip votre dossier

Code:

using (ZipFile Zip = new ZipFile())
{
    Zip.AddFile("C:\test\test.txt");
    Zip.AddFile("C:\test\test2.txt");
    Zip.Save("C:\output.Zip");
}

Si vous ne souhaitez pas que la structure de dossier d'origine soit mise en miroir dans le fichier Zip, examinez les remplacements pour AddFile () et AddFolder (), etc.

16
NickG

Il existe une classe intégrée dans System.IO.Packaging appelée ZipPackage:

http://msdn.Microsoft.com/en-us/library/system.io.packaging.zippackage(v=vs.100).aspx

2
Bas

Vous pouvez simplement utiliser le programme de ligne de commande ms-dos compact.exe . Recherchez un paramètre compact.exe dans cmd et démarrez ce processus à l'aide de la méthode .NET Process.Start ().

1
1
CarlosJ

utilisez simplement le code suivant pour compresser un fichier.

       public void Compressfile()
        {
             string fileName = "Text.txt";
             string sourcePath = @"C:\SMSDBBACKUP";
             DirectoryInfo di = new DirectoryInfo(sourcePath);
             foreach (FileInfo fi in di.GetFiles())
             {
                 //for specific file 
                 if (fi.ToString() == fileName)
                 {
                     Compress(fi);
                 }
             } 
        }

public static void Compress(FileInfo fi)
        {
            // Get the stream of the source file.
            using (FileStream inFile = fi.OpenRead())
            {
                // Prevent compressing hidden and 
                // already compressed files.
                if ((File.GetAttributes(fi.FullName)
                    & FileAttributes.Hidden)
                    != FileAttributes.Hidden & fi.Extension != ".gz")
                {
                    // Create the compressed file.
                    using (FileStream outFile =
                                File.Create(fi.FullName + ".gz"))
                    {
                        using (GZipStream Compress =
                            new GZipStream(outFile,
                            CompressionMode.Compress))
                        {
                            // Copy the source file into 
                            // the compression stream.
                            inFile.CopyTo(Compress);

                            Console.WriteLine("Compressed {0} from {1} to {2} bytes.",
                                fi.Name, fi.Length.ToString(), outFile.Length.ToString());
                        }
                    }
                }
            }
        }

    }
1
Jeetendra Negi

Utilisez http://dotnetzip.codeplex.com/ pour les fichiers ou répertoires Zip, il n’existe pas de classe intégrée permettant de le faire directement dans .NET

0
Arnaud F.

Avec DotNetZip http://dotnetzip.codeplex.com/ , il existe une méthode AddDirectory () sur la classe ZipFile qui fait ce que vous voulez:

using (var Zip = new Ionic.Zip.ZipFile())
{
    Zip.AddDirectory("DirectoryOnDisk", "rootInZipFile");
    Zip.Save("MyFile.Zip");
}

Bonne continuation ...

0
Alexandre Jaslier

Pour .Net Framework 4.5, voici l'exemple le plus clair que j'ai trouvé:

using System;
using System.IO;
using System.IO.Compression;

namespace ConsoleApplication
{
    class Program
    {
        static void Main(string[] args)
        {
            string startPath = @"c:\example\start";
            string zipPath = @"c:\example\result.Zip";
            string extractPath = @"c:\example\extract";

            ZipFile.CreateFromDirectory(startPath, zipPath);

            ZipFile.ExtractToDirectory(zipPath, extractPath);
        }
    }
}

Vous devrez ajouter une référence à System.IO.Compression.FileSystem.

De: https://docs.Microsoft.com/en-us/dotnet/standard/io/how-to-compress-and-extract-files

0
Waldo Sonntag

Code source issu de MSDN compatible avec .Net 2.0 et supérieur

public static void CompressFile(string path)
        {
            FileStream sourceFile = File.OpenRead(path);
            FileStream destinationFile = File.Create(path + ".gz");

            byte[] buffer = new byte[sourceFile.Length];
        sourceFile.Read(buffer, 0, buffer.Length);

        using (GZipStream output = new GZipStream(destinationFile,
            CompressionMode.Compress))
        {
            Console.WriteLine("Compressing {0} to {1}.", sourceFile.Name,
                destinationFile.Name, false);

            output.Write(buffer, 0, buffer.Length);
        }

        // Close the files.
        sourceFile.Close();
        destinationFile.Close();
    }  
0
Romil Kumar Jain