web-dev-qa-db-ja.com

OpenSource DLLを使用せずにC#4.0を使用してFolderからすべての.Zipファイルを解凍する方法は?

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

検索しましたが、Framework 4.0以前を使用して* .Zipファイルを展開するためのソリューションが見つかりませんでした。

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

20
SHEKHAR SHETE

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以降。

30
Denys Denysenko

私も同じ質問をして、問題を解決する素晴らしい非常にシンプルな記事を見つけました。 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について説明します

EDIT:これを使用する私のアプリが実行されている数年後に、アプリが突然停止したという不満を2人のユーザーから受けました。 CopyHere関数が一時ファイル/フォルダーを作成し、これらが削除されて問題が発生したことはないようです。これらのファイルの場所は、System.IO.Path.GetTempPath()にあります。

14
TBD

ZipPackage は開始する場所かもしれません。 System.IO.Packaging 内にあり、.NET 4.0で利用可能

上記の.NET 4.5メソッドの単純さに近いところはありませんが、望みどおりに実行できるようです。

1
Alex

DotNetZip (オープンソース)を使用できます `

string zipFilePath = "C:\\sample.Zip";
string extractedFilePath = "C:\\sampleFolder";

ZipFile zipfile = ZipFile.Read(zipFilePath); 
if (!Directory.Exists(extractedFilePath))
    Directory.CreateDirectory(extractedFilePath); 

foreach (ZipEntry e in zipfile)
{
        e.Extract(extractedFilePath,ExtractExistingFileAction.OverwriteSilently);
}`
0
engntsn

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

0
Michael Blake

私は同じ問題を抱えていて、次のように、C#コードからcmd Shellを介して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」ファイルでのみ試しました。お役に立てれば。

0
josuapop