推荐一个库/ API来解压C#文件
看起来像C#中没有内置的库/ API来解压zip文件。 我正在寻找一个免费的(更好的开源)库/ API,可以与.net 3.5 + VSTS 2008 + C#解压zip文件,并提取所有文件到特定的文件夹。
任何推荐的图书馆/ API或样本?
GPL
http://www.icsharpcode.net/OpenSource/SharpZipLib/
或限制性较小的Ms-PL
http://www.codeplex.com/DotNetZip
为了完成这个答案.net框架有ZipPackage我没有成功。
如果你只想把一个文件的内容解压缩到一个文件夹中,并且你知道只能在Windows上运行,那么你可以使用Windows Shell对象。 在这个例子中我使用了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);
您可以使用FILEOP_FLAGS来控制CopyHere
方法的行为。
DotNetZip易于使用。 这是一个解压缩的示例
using (var zip = Ionic.Zip.ZipFile.Read("archive.zip")) { zip.ExtractAll("unpack-directory"); }
如果你有更复杂的需求,比如你想挑选哪些条目来提取,或者是否有密码,或者你想控制提取的文件的path名等等,那么有很多select。 查看帮助文件以获取更多示例。
DotNetZip是免费的,开源的。
在过去,我已经使用了DotNetZip (MS-PL), SharpZipLib (GPL)和用于C# (公共领域)的7ZIP SDK 。 他们都工作得很好,而且是开源的。
在这种情况下,我会selectDotNetZip,下面是一些来自C#Examples页面的示例代码:
using (ZipFile zip = ZipFile.Read(ExistingZipFile)) { foreach (ZipEntry e in zip) { e.Extract(TargetDirectory); } }
看看我的小图书馆:http: //zipstorer.codeplex.com
如果你想使用7-zip压缩,请查看Peter Bromberg的EggheadCafe文章 。 当心:C#的LZMA源代码没有XML注释(实际上,几乎没有评论)。
如果你不想使用外部组件,这里是我昨晚使用.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下方有一个示例文件。
-
我没有testing过CopyStream方法来确保它的行为正确,因为我最初使用Stream.CopyTo()方法为.NET 4.0开发了这个方法。
#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
我宁愿SharpZiplib请find示例代码来解压.Net文件中的C#
我会推荐我们的http://www.rebex.net/zip.net/,但我很偏向。; 下载试用版并自行检查function和示例。
SevenZipSharp是一个围绕7z.dll和LZMA SDK的包装,它是开源的,免费的。
SevenZipCompressor compressor = new SevenZipCompressor(); compressor.CompressionLevel = CompressionLevel.Ultra; compressor.CompressionMethod = CompressionMethod.Lzma; compressor.CompressionMode = CompressionMode.Create; compressor.CompressFiles(...);