24

.ZIP ファイルを含むフォルダがあります。ここで、C# を使用して ZIP ファイルを特定のフォルダーに抽出しますが、外部アセンブリや .Net Framework 4.5 は使用しません。

検索しましたが、Framework 4.0 以下を使用して *.zip ファイルを解凍するための解決策が見つかりませんでした。

GZipStream を試してみましたが、.gz のみをサポートし、.zip ファイルはサポートしていません。

4

6 に答える 6

34

msdnの例を次に示します。System.IO.Compression.ZipFileそのためだけに作られています:

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

編集:申し訳ありませんが、あなたが .NET 4.0 以下に興味を持っていることを見逃していました。必須の .NET Framework 4.5 以降。

于 2013-04-17T06:19:03.870 に答える
16

同じ質問があり、問題を解決する素晴らしい非常にシンプルな記事を見つけました. http://www.fluxbytes.com/csharp/unzipping-files-using-shell32-in-c/

Microsoft Shell Controls And Automation (Interop.Shell32.dll) という COM ライブラリを参照する必要があります。

コード (記事から手を加えていないので、どれだけ単純かがわかります):

public static void UnZip(string zipFile, string folderPath)
{
    if (!File.Exists(zipFile))
        throw new FileNotFoundException();

    if (!Directory.Exists(folderPath))
        Directory.CreateDirectory(folderPath);

    Shell32.Shell objShell = new Shell32.Shell();
    Shell32.Folder destinationFolder = objShell.NameSpace(folderPath);
    Shell32.Folder sourceFile = objShell.NameSpace(zipFile);

    foreach (var file in sourceFile.Items())
    {
        destinationFolder.CopyHere(file, 4 | 16);
    }
}

記事を読むことを強くお勧めします-彼はフラグ4 | 16の説明をもたらします

編集:これを使用する私のアプリが実行されてから数年後、2人のユーザーから、アプリが突然機能しなくなったという苦情がありました。CopyHere 機能によって一時ファイル/フォルダーが作成され、これらが削除されず、問題が発生したようです。これらのファイルの場所は、System.IO.Path.GetTempPath() で確認できます。

于 2014-11-03T14:07:25.233 に答える
0

私は同じ問題を抱えていて、次のように C# コードから cmd シェルを介して 7-zip 実行可能ファイルを呼び出すことで解決しました。

string zipped_path = "xxx.7z";
string unzipped_path = "yyy";
string arguments = "e " + zipped_path + " -o" + unzipped_path;

System.Diagnostics.Process process
         = Launch_in_Shell("C:\\Program Files (x86)\\7-Zip\\","7z.exe", arguments);

if (!(process.ExitCode == 0))
     throw new Exception("Unable to decompress file: " + zipped_path);

そして、どこLaunch_in_Shell(...)で定義されています

public static System.Diagnostics.Process Launch_in_Shell(string WorkingDirectory,
                                                         string FileName, 
                                                         string Arguments)
{
       System.Diagnostics.ProcessStartInfo processInfo 
                                         = new System.Diagnostics.ProcessStartInfo();

        processInfo.WorkingDirectory = WorkingDirectory;
        processInfo.FileName = FileName;
        processInfo.Arguments = Arguments;
        processInfo.UseShellExecute = true;
        System.Diagnostics.Process process 
                                      = System.Diagnostics.Process.Start(processInfo);

        return process;
}

欠点: マシンに 7zip をインストールする必要があります。私は ".7z" ファイルでのみ試しました。お役に立てれば。

于 2014-11-06T17:46:51.327 に答える
0

.NET 3.5 には、このための DeflateStream があります。ディレクトリなどの情報は構造体を作成する必要がありますが、PKWare が公開している情報です。私は unzip ユーティリティを作成しましたが、構造体を作成すれば特に面倒なことはありません。

于 2014-06-06T18:13:09.560 に答える
0

ZipPackageが出発点になるかもしれません。System.IO.Packaging内にあり、.NET 4.0 で使用できます。

上記の .NET 4.5 メソッドの単純さにはほど遠いですが、やりたいことはできるようです。

于 2013-04-17T06:21:34.613 に答える