。Zipファイルを含むフォルダーがあります。次に、C#を使用して外部アセンブリまたは.Net Framework 4.5を使用せずに、特定のフォルダーにZipファイルを抽出します。
検索しましたが、Framework 4.0以前を使用して* .Zipファイルを展開するためのソリューションが見つかりませんでした。
GZipStreamを試しましたが、.gzのみをサポートし、.Zipファイルはサポートしません。
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以降。
私も同じ質問をして、問題を解決する素晴らしい非常にシンプルな記事を見つけました。 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()にあります。
ZipPackage は開始する場所かもしれません。 System.IO.Packaging 内にあり、.NET 4.0で利用可能
上記の.NET 4.5メソッドの単純さに近いところはありませんが、望みどおりに実行できるようです。
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);
}`
.NET 3.5にはこのためのDeflateStreamがあります。ディレクトリなどの情報の構造体を作成する必要がありますが、PKWareはこの情報を公開しています。解凍ユーティリティを作成しましたが、そのための構造体を作成した後は特に面倒ではありません。
私は同じ問題を抱えていて、次のように、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」ファイルでのみ試しました。お役に立てれば。