web-dev-qa-db-ja.com

ファイルを圧縮する方法

C#でファイルとディレクトリを圧縮したい。インターネットでいくつかの解決策を見つけましたが、それらは非常に複雑であり、プロジェクトで実行できませんでした。誰かが私に明確で効果的な解決策を提案できますか?

15
selentoptas

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

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

24
Darren

既存のどの回答よりも簡単な方法を見つけたので、この回答を追加します。

  1. DotNetZip DLLをソリューションにインストールします(最も簡単な方法は the package をnugetからインストールすることです)
  2. DLLへの参照を追加します。
  3. 追加して名前空間をインポートします。Ionic.Zipを使用します。
  4. ファイルを圧縮する

コード:

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()などのオーバーライドを確認してください。

16
NickG

ZipPackageと呼ばれる組み込みクラスがSystem.IO.Packagingにあります:

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

2
Bas

Ms-dosコマンドラインプログラムcompact.exeを使用するだけです。 cmdでパラメータcompact.exeを探し、.NETメソッドProcess.Start()を使用してこのプロセスを開始します。

1
CarlosJ

ファイルを圧縮するには、次のコードを使用してください。

       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

ファイルまたはディレクトリをZipするには http://dotnetzip.codeplex.com/ を使用します。NETで直接実行する組み込みクラスはありません

0
Arnaud F.

DotNetZip http://dotnetzip.codeplex.com/ を使用すると、ZipFileクラスにAddDirectory()メソッドがあり、必要な処理を実行できます。

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

ボンの続き...

0

.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

0
Waldo Sonntag

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