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?
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());
}
}
}
}
}
J'ajoute cette réponse car j'ai trouvé un moyen plus facile que n'importe quelle réponse existante:
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.
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
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 ().
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());
}
}
}
}
}
}
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
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 ...
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
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();
}