.ZIP ファイルを含むフォルダがあります。ここで、C# を使用して ZIP ファイルを特定のフォルダーに抽出しますが、外部アセンブリや .Net Framework 4.5 は使用しません。
検索しましたが、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の説明をもたらします
編集:これを使用する私のアプリが実行されてから数年後、2人のユーザーから、アプリが突然機能しなくなったという苦情がありました。CopyHere 機能によって一時ファイル/フォルダーが作成され、これらが削除されず、問題が発生したようです。これらのファイルの場所は、System.IO.Path.GetTempPath() で確認できます。
私は同じ問題を抱えていて、次のように 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" ファイルでのみ試しました。お役に立てれば。
.NET 3.5 には、このための DeflateStream があります。ディレクトリなどの情報は構造体を作成する必要がありますが、PKWare が公開している情報です。私は unzip ユーティリティを作成しましたが、構造体を作成すれば特に面倒なことはありません。
ZipPackageが出発点になるかもしれません。System.IO.Packaging内にあり、.NET 4.0 で使用できます。
上記の .NET 4.5 メソッドの単純さにはほど遠いですが、やりたいことはできるようです。