C#でファイルとディレクトリを圧縮したい。インターネットでいくつかの解決策を見つけましたが、それらは非常に複雑であり、プロジェクトで実行できませんでした。誰かが私に明確で効果的な解決策を提案できますか?
System.IO.Compression
名前空間でGZipStream
を使用できます
.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());
}
}
}
}
}
既存のどの回答よりも簡単な方法を見つけたので、この回答を追加します。
コード:
using (ZipFile Zip = new ZipFile())
{
Zip.AddFile("C:\test\test.txt");
Zip.AddFile("C:\test\test2.txt");
Zip.Save("C:\output.Zip");
}
元のフォルダー構造をZipファイルにミラーリングしたくない場合は、AddFile()やAddFolder()などのオーバーライドを確認してください。
ZipPackage
と呼ばれる組み込みクラスがSystem.IO.Packaging
にあります:
http://msdn.Microsoft.com/en-us/library/system.io.packaging.zippackage(v = vs.100).aspx
Ms-dosコマンドラインプログラムcompact.exeを使用するだけです。 cmdでパラメータcompact.exeを探し、.NETメソッドProcess.Start()を使用してこのプロセスを開始します。
ファイルを圧縮するには、次のコードを使用してください。
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());
}
}
}
}
}
}
ファイルまたはディレクトリをZipするには http://dotnetzip.codeplex.com/ を使用します。NETで直接実行する組み込みクラスはありません
DotNetZip http://dotnetzip.codeplex.com/ を使用すると、ZipFileクラスにAddDirectory()メソッドがあり、必要な処理を実行できます。
using (var Zip = new Ionic.Zip.ZipFile())
{
Zip.AddDirectory("DirectoryOnDisk", "rootInZipFile");
Zip.Save("MyFile.Zip");
}
ボンの続き...
.Net Framework 4.5の場合、これは私が見つけた最も明確な例です。
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);
}
}
}
System.IO.Compression.FileSystemへの参照を追加する必要があります
差出人: https://docs.Microsoft.com/en-us/dotnet/standard/io/how-to-compress-and-extract-files
。Net 2.0以降と互換性のあるMSDNから取得したソースコード
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();
}