250

圧縮ファイルをプログラムで解凍しようとしています。

.NET でクラスを使用しようとしましたSystem.IO.Compression.GZipStreamが、アプリを実行すると (実際には単体テスト)、次の例外が発生します。

System.IO.InvalidDataException: GZip ヘッダーのマジック ナンバーが正しくありません。GZip ストリームを渡していることを確認してください。

ファイルはファイルと同じではなく、ファイル.zipと同じではないことに気付きました。.gzGZipZip

ただし、zipファイルを手動でダブルクリックしてから[すべてのファイルを抽出]ボタンをクリックすると、ファイルを抽出できるため、コードでもそれを行う方法があるはずです。

Process.Start()したがって、圧縮ファイルへのパスを入力として使用しようとしました。これにより、私のアプリは、圧縮されたファイルの内容を表示するウィンドウを開きます。これで問題ありませんが、アプリはサーバーにインストールされ、[すべてのファイルを抽出] ボタンをクリックする必要はありません。

では、アプリで zip ファイル内のファイルを抽出するにはどうすればよいでしょうか?

または、それを行う別の方法はありますか?サードパーティのライブラリやアプリをダウンロードせずに、コードで行うことを好みます。セキュリティ部門はそれについてあまり空想的ではありません...

4

15 に答える 15

534

.NET 4.5では、.NET フレームワークを使用してファイルを解凍できるようになりました。

using System;
using System.IO;

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";

      System.IO.Compression.ZipFile.CreateFromDirectory(startPath, zipPath);
      System.IO.Compression.ZipFile.ExtractToDirectory(zipPath, extractPath);
    }
  }
}

上記のコードは、Microsoft のドキュメントから直接取得したものです: http://msdn.microsoft.com/en-us/library/ms404280(v=vs.110).aspx

ZipFileアセンブリに含まれていSystem.IO.Compression.FileSystemます。( nateirvin に感謝します...以下のコメントを参照してください)。フレームワーク アセンブリに DLL 参照を追加する必要があります。System.IO.Compression.FileSystem.dll

于 2013-01-31T20:58:31.630 に答える
57

無料で、外部 DLL ファイルはありません。すべてが 1 つの CS ファイルに含まれています。1 つのダウンロードは単なる CS ファイルで、もう 1 つのダウンロードは非常にわかりやすい例です。今日試してみたところ、セットアップがどれほど簡単だったか信じられません。最初の試行で、エラーも何もありませんでした。

https://github.com/jaime-olivares/zipstorer

于 2012-09-14T18:34:22.837 に答える
28

http://www.codeplex.com/DotNetZipで DotNetZip ライブラリを使用します。

zip ファイルを操作するためのクラス ライブラリとツールセット。VB、C#、または任意の .NET 言語を使用して、zip ファイルを簡単に作成、抽出、または更新します...

DotNetZip は、完全な .NET Framework を搭載した PC で動作し、.NET Compact Framework を使用するモバイル デバイスでも動作します。VB、C#、または任意の .NET 言語、または任意のスクリプト環境で zip ファイルを作成して読み取る...

.NET BCL に組み込まれているものを置き換えるより優れた DeflateStream または GZipStream クラスが必要な場合は、DotNetZip にもそれがあります。DotNetZip の DeflateStream と GZipStream は、Zlib の .NET ポートに基づくスタンドアロン アセンブリで利用できます。これらのストリームは圧縮レベルをサポートし、組み込みクラスよりもはるかに優れたパフォーマンスを提供します。セットを完成させる ZlibStream もあります (RFC 1950、1951、1952)...

于 2009-05-07T20:05:58.557 に答える
4

これでできますSystem.IO.Compression.ZipFile.ExtractToDirectory(ZipName, ExtractToPath)

于 2019-03-29T16:43:22.480 に答える
2

これを使用して、複数のファイルを圧縮または解凍します。正規表現は必須ではありませんが、日付スタンプを変更し、不要なアンダースコアを削除するために使用しています。Compress >> zipPath 文字列で空の文字列を使用して、必要に応じてすべてのファイルに何かをプレフィックスとして付けます。また、私は通常、自分が行っていることに基づいて Compress() または Decompress() のいずれかをコメントアウトします。

using System;
using System.IO.Compression;
using System.IO;
using System.Text.RegularExpressions;

namespace ZipAndUnzip
{
    class Program
    {
        static void Main(string[] args)
        {
            var directoryPath = new DirectoryInfo(@"C:\your_path\");

            Compress(directoryPath);
            Decompress(directoryPath);
        }

        public static void Compress(DirectoryInfo directoryPath)
        {
            foreach (DirectoryInfo directory in directoryPath.GetDirectories())
            {
                var path = directoryPath.FullName;
                var newArchiveName = Regex.Replace(directory.Name, "[0-9]{8}", "20130913");
                newArchiveName = Regex.Replace(newArchiveName, "[_]+", "_");
                string startPath = path + directory.Name;
                string zipPath = path + "" + newArchiveName + ".zip";

                ZipFile.CreateFromDirectory(startPath, zipPath);
            }

        }

        public static void Decompress(DirectoryInfo directoryPath)
        {
            foreach (FileInfo file in directoryPath.GetFiles())
            {
                var path = directoryPath.FullName;
                string zipPath = path + file.Name;
                string extractPath = Regex.Replace(path + file.Name, ".zip", "");

                ZipFile.ExtractToDirectory(zipPath, extractPath);
            }
        }


    }
}
于 2013-09-13T19:44:55.313 に答える
2

DeflateStream を使用して、.NET 3.5 内ですべて実行できます。.NET 3.5 に欠けているのは、圧縮されたファイルを整理するために使用されるファイル ヘッダー セクションを処理する機能です。PKWare はこの情報を公開しており、使用する構造を作成した後に zip ファイルを処理するために使用できます。これは特に面倒なことではなく、サードパーティのコードを使用せずにツールを構築するための良い方法です。

これは 1 行の回答ではありませんが、自分で時間を取る意思と能力があれば、完全に実行可能です。数時間でこれを行うクラスを作成しました。その結果、.NET 3.5 のみを使用してファイルを zip および unzip できるようになりました。

于 2014-05-12T14:30:03.557 に答える
2

標準の zip ファイルは通常、deflate アルゴリズムを使用します。

サード パーティのライブラリを使用せずにファイルを抽出するには、DeflateStream を使用します。Microsoft は圧縮アルゴリズムのみを提供しているため、zip ファイルのアーカイブ形式についてもう少し情報が必要です。

zipfldr.dll を使用することもできます。これは、Microsoft の圧縮ライブラリ ([送信先] メニューの圧縮フォルダー) です。com ライブラリのように見えますが、文書化されていません。実験を通して、あなたのためにそれを働かせることができるかもしれません。

于 2009-05-07T20:06:35.183 に答える
0

埋め込みリソースから:

using (Stream _pluginZipResourceStream = Assembly.GetExecutingAssembly().GetManifestResourceStream(programName + "." + "filename.zip"))
{
    using (ZipArchive zip = new ZipArchive(_pluginZipResourceStream))
    {
        zip.ExtractToDirectory(Application.StartupPath);
    }
}
于 2016-01-13T15:31:44.880 に答える
0

Info-unzipコマンド ライン codを使用できます。Info -unzip 公式 Web サイトから unzip.exe をダウンロードするだけで済みます。

 internal static void Unzip(string sorcefile)
    {
        try
        {
            AFolderFiles.AFolderFilesDelete.DeleteFolder(TempBackupFolder); // delete old folder   
            AFolderFiles.AFolderFilesCreate.CreateIfNotExist(TempBackupFolder); // delete old folder   
           //need to Command command also to export attributes to a excel file
            System.Diagnostics.Process process = new System.Diagnostics.Process();
            System.Diagnostics.ProcessStartInfo startInfo = new System.Diagnostics.ProcessStartInfo();
            startInfo.WindowStyle = System.Diagnostics.ProcessWindowStyle.Hidden; // window type
            startInfo.FileName = UnzipExe;
            startInfo.Arguments = sorcefile + " -d " + TempBackupFolder;
            process.StartInfo = startInfo;
            process.Start();
            //string result = process.StandardOutput.ReadToEnd();
            process.WaitForExit();
            process.Dispose();
            process.Close();
        }
        catch (Exception ex){ throw ex; }
    }        
于 2018-08-08T12:24:59.457 に答える
0

DotNetZip でハード バグに遭遇したため、今日これ(NuGet の Unzip パッケージ)について知りました。また、過去 2 年間、DotNetZip でそれほど多くの作業が行われていないことに気付きました。

Unzip パッケージは無駄のないもので、DotNetZip のようなバグはありませんでした。また、実際の解凍は Microsoft BCL に依存しているため、かなり小さなファイルでした。必要な調整を簡単に行うことができました(解凍中に進行状況を追跡できるようにするため)。私はそれをお勧めします。

于 2013-11-07T22:51:30.477 に答える