Zipファイルを解凍するには、C#の組み込みライブラリ/ APIのように見えます。私はzipファイルを解凍して特定のフォルダにすべてのファイルを抽出するために.Net 3.5 + VSTS 2008 + C#で動作する無料の(より良いオープンソースの)ライブラリ/ APIを探しています。は、C#でファイルを解凍するライブラリ/ APIをお勧めします
おすすめのライブラリ/ APIまたはサンプルはありますか?
Zipファイルを解凍するには、C#の組み込みライブラリ/ APIのように見えます。私はzipファイルを解凍して特定のフォルダにすべてのファイルを抽出するために.Net 3.5 + VSTS 2008 + C#で動作する無料の(より良いオープンソースの)ライブラリ/ APIを探しています。は、C#でファイルを解凍するライブラリ/ APIをお勧めします
おすすめのライブラリ/ APIまたはサンプルはありますか?
GPL
http://www.icsharpcode.net/OpenSource/SharpZipLib/
以下の制限のMs-PL
http://www.codeplex.com/DotNetZip
.NET Frameworkが、私はそれであまり成功を収めてZipPackageを持ってこの答えを完了します。
.NETのZipPackageクラスはどう思いますか? – George2
あなたは7-ZIP圧縮を使用する場合は、ピーターBrombergのEggheadCafe articleをチェックしてください。注意:C#のLZMA source codeにはxmlコメントはありません(実際にはコメントはほとんどありません)。
DotNetZipは使いやすいです。あなたが抽出するためにエントリかを選択ピックアンドたいようにあなたは、より多くの複雑なニーズを持っている場合、またはパスワードが存在する場合、またはあなたが抽出されたファイルのパス名を制御したい場合はここで解凍サンプル
using (var zip = Ionic.Zip.ZipFile.Read("archive.zip"))
{
zip.ExtractAll("unpack-directory");
}
です、etc ...など、多くのオプションがあります。より多くの例についてはCheck the help fileを参照してください。
DotNetZipは無料でオープンソースです。
以前は、DotNetZip(MS-PL)、SharpZipLib(GPL)、7ZIP SDK for C#(パブリックドメイン)を使用していました。彼らはすべて素晴らしい仕事をしており、オープンソースです。
私はこのような状況でDotNetZipを選ぶだろう、とここC# Examples pageからいくつかのサンプルコードです:
using (ZipFile zip = ZipFile.Read(ExistingZipFile))
{
foreach (ZipEntry e in zip)
{
e.Extract(TargetDirectory);
}
}
GPPLではなくLGPL - 違いはかなり大きいです。 –
@Quandaryどちらか?彼らのウェブサイトによると、SharpZipLibはGPLです。 –
GPLは例外です(プロジェクトと静的または動的にリンクするのはGPLの下での作業ではありません)= LGPL(OK、静的にリンクする権限はLGPLにないため、静的リンクは珍しい.NETの場合)。率直に言って、LGPLのよりリベラルなバージョンです。 –
私はSharpZiplib を好むだろう UnZip Files in .Net C#
私はhttp://www.rebex.net/zip.net/をお勧めしますが、私は偏っています。 Downloadを試して、機能やサンプルを自分で確認してください。
ファイルの内容をフォルダに解凍し、Windowsでのみ実行することがわかっている場合は、Windowsシェルオブジェクトを使用できます。この例ではFramework 4.0のdynamic
を使用しましたが、Type.InvokeMember
を使用しても同じ結果が得られます。
dynamic shellApplication = Activator.CreateInstance(Type.GetTypeFromProgID("Shell.Application"));
dynamic compressedFolderContents = shellApplication.NameSpace(sourceFile).Items;
dynamic destinationFolder = shellApplication.NameSpace(destinationPath);
destinationFolder.CopyHere(compressedFolderContents);
あなたはCopyHere
メソッドの動作を制御するためにFILEOP_FLAGSを使用することができます。
外部コンポーネントを使用したくない場合は、.NETのZipPackageクラスを使用して昨夜開発したコードを次に示します。注意すべき
private static void Unzip()
{
var zipFilePath = "c:\\myfile.zip";
var tempFolderPath = "c:\\unzipped";
using (Package pkg = ZipPackage.Open(zipFilePath, FileMode.Open, FileAccess.Read))
{
foreach (PackagePart part in pkg.GetParts())
{
var target = Path.GetFullPath(Path.Combine(tempFolderPath, part.Uri.OriginalString.TrimStart('/')));
var targetDir = target.Remove(target.LastIndexOf('\\'));
if (!Directory.Exists(targetDir))
Directory.CreateDirectory(targetDir);
using (Stream source = part.GetStream(FileMode.Open, FileAccess.Read))
{
CopyStream(source, File.OpenWrite(target));
}
}
}
}
private static void CopyStream(Stream input, Stream output)
{
byte[] buffer = new byte[4096];
int read;
while ((read = input.Read(buffer, 0, buffer.Length)) > 0)
{
output.Write(buffer, 0, read);
}
}
もの:
ZIPアーカイブには、そのルートに[CONTENT_TYPES]の.xmlファイルを持たなければなりません。このコードで抽出されたZIPファイルの圧縮を制御するので、これは私の要件にとっては問題ではありませんでした。 [Content_Types] .xmlファイルの詳細については、http://msdn.microsoft.com/en-us/magazine/cc163372.aspxを参照してください。記事の図13の下にサンプルファイルがあります。
私が元々Stream.CopyTo()メソッドを使用してこれを.NET 4.0用に開発したので、CopyStreamメソッドが正しく動作するようにはテストしていません。
#region CreateZipFile
public void StartZip(string directory, string zipfile_path)
{
Label1.Text = "Please wait, taking backup";
#region Taking files from root Folder
string[] filenames = Directory.GetFiles(directory);
// path which the zip file built in
ZipOutputStream p = new ZipOutputStream(File.Create(zipfile_path));
foreach (string filename in filenames)
{
FileStream fs = File.OpenRead(filename);
byte[] buffer = new byte[fs.Length];
fs.Read(buffer, 0, buffer.Length);
ZipEntry entry = new ZipEntry(filename);
p.PutNextEntry(entry);
p.Write(buffer, 0 , buffer.Length);
fs.Close();
}
#endregion
string dirName= string.Empty;
#region Taking folders from root folder
DirectoryInfo[] DI = new DirectoryInfo(directory).GetDirectories("*.*", SearchOption.AllDirectories);
foreach (DirectoryInfo D1 in DI)
{
// the directory you need to zip
filenames = Directory.GetFiles(D1.FullName);
if (D1.ToString() == "backup")
{
filenames = null;
continue;
}
if (dirName == string.Empty)
{
if (D1.ToString() == "updates" || (D1.Parent).ToString() == "updates" || (D1.Parent).Parent.ToString() == "updates" || ((D1.Parent).Parent).Parent.ToString() == "updates" || (((D1.Parent).Parent).Parent).ToString() == "updates" || ((((D1.Parent).Parent).Parent)).ToString() == "updates")
{
dirName = D1.ToString();
filenames = null;
continue;
}
}
else
{
if (D1.ToString() == dirName) ;
}
foreach (string filename in filenames)
{
FileStream fs = File.OpenRead(filename);
byte[] buffer = new byte[fs.Length];
fs.Read(buffer, 0, buffer.Length);
ZipEntry entry = new ZipEntry(filename);
p.PutNextEntry(entry);
p.Write(buffer, 0, buffer.Length);
fs.Close();
}
filenames = null;
}
p.SetLevel(5);
p.Finish();
p.Close();
#endregion
}
#endregion
#region EXTRACT THE ZIP FILE
public bool UnZipFile(string InputPathOfZipFile, string FileName)
{
bool ret = true;
Label1.Text = "Please wait, extracting downloaded file";
string zipDirectory = string.Empty;
try
{
#region If Folder already exist Delete it
if (Directory.Exists(Server.MapPath("~/updates/" + FileName))) // server data field
{
String[] files = Directory.GetFiles(Server.MapPath("~/updates/" + FileName));//server data field
foreach (var file in files)
File.Delete(file);
Directory.Delete(Server.MapPath("~/updates/" + FileName), true);//server data field
}
#endregion
if (File.Exists(InputPathOfZipFile))
{
string baseDirectory = Path.GetDirectoryName(InputPathOfZipFile);
using (ZipInputStream ZipStream = new
ZipInputStream(File.OpenRead(InputPathOfZipFile)))
{
ZipEntry theEntry;
while ((theEntry = ZipStream.GetNextEntry()) != null)
{
if (theEntry.IsFile)
{
if (theEntry.Name != "")
{
string directoryName = theEntry.Name.Substring(theEntry.Name.IndexOf(FileName)); // server data field
string[] DirectorySplit = directoryName.Split('\\');
for (int i = 0; i < DirectorySplit.Length - 1; i++)
{
if (zipDirectory != null || zipDirectory != "")
zipDirectory = zipDirectory + @"\" + DirectorySplit[i];
else
zipDirectory = zipDirectory + DirectorySplit[i];
}
string first = Server.MapPath("~/updates") + @"\" + zipDirectory;
if (!Directory.Exists(first))
Directory.CreateDirectory(first);
string strNewFile = @"" + baseDirectory + @"\" + directoryName;
if (File.Exists(strNewFile))
{
continue;
}
zipDirectory = string.Empty;
using (FileStream streamWriter = File.Create(strNewFile))
{
int size = 2048;
byte[] data = new byte[2048];
while (true)
{
size = ZipStream.Read(data, 0, data.Length);
if (size > 0)
streamWriter.Write(data, 0, size);
else
break;
}
streamWriter.Close();
}
}
}
else if (theEntry.IsDirectory)
{
string strNewDirectory = @"" + baseDirectory + @"\" +
theEntry.Name;
if (!Directory.Exists(strNewDirectory))
{
Directory.CreateDirectory(strNewDirectory);
}
}
}
ZipStream.Close();
}
}
}
catch (Exception ex)
{
ret = false;
}
return ret;
}
#endregion
SevenZipSharpは、オープンソース、無料でthaの7z.dllとLZMA SDK、ラッパです。
SevenZipCompressor compressor = new SevenZipCompressor();
compressor.CompressionLevel = CompressionLevel.Ultra;
compressor.CompressionMethod = CompressionMethod.Lzma;
compressor.CompressionMode = CompressionMode.Create;
compressor.CompressFiles(...);
同様に.Netには実装が組み込まれていますが、その作業が不可能なのは –
です。最初は気に入っています。 .Netの場合は、どのクラスですか? – George2
なぜNet ZipPackageの成功率は低いですか? – George2