.Net Zip Up文件

什么是使用C#压缩文件的最佳方法? 理想情况下,我希望能够将文件分成单个存档。

您可以使用DotNetZip来实现这一目标。 它可以在任何应用程序中自由使用。

这是一些示例代码:

try { // for easy disposal using (ZipFile zip = new ZipFile()) { // add this map file into the "images" directory in the zip archive zip.AddFile("c:\\images\\personal\\7440-N49th.png", "images"); // add the report into a different directory in the archive zip.AddFile("c:\\Reports\\2008-Regional-Sales-Report.pdf", "files"); zip.AddFile("ReadMe.txt"); zip.Save("MyZipFile.zip"); } } catch (System.Exception ex1) { System.Console.Error.WriteLine("exception: " + ex1); } 

如果你有4.5+版本,现在已经内置到框架中

否则,使用Ionic。

名称空间是System.IO.Packaging.ZIPPackage

有关故事,请参见http://visualstudiomagazine.com/articles/2012/05/21/net-framework-gets-zip.aspx 。

你看过SharpZipLib了吗?

我相信你可以使用System.IO.Packaging命名空间中的类构建zip文件 – 但每次我试图调查它时,我发现它相当令人困惑……

看看这个库: http : //www.icsharpcode.net/OpenSource/SharpZipLib/

它非常全面,它涉及多种格式,是开源的,您可以在闭源商业应用程序中使用。

它使用起来非常简单:

 byte[] data1 = new byte[...]; byte[] data2 = new byte[...]; /*...*/ var path = @"c:\test.zip"; var zip = new ZipOutputStream(new FileStream(path, FileMode.Create)) { IsStreamOwner = true } zip.PutNextEntry("File1.txt"); zip.Write(data1, 0, data1.Length); zip.PutNextEntry("File2.txt"); zip.Write(data2, 0, data2.Length); zip.Close(); zip.Dispose(); 

有几个图书馆 – 最受欢迎的是DotNetZip和SharpZipLib 。

嗨我用ShapLib库创建了两个方法(你可以在这里下载http://www.icsharpcode.net/opensource/sharpziplib/ )想要分享,它们很容易使用只需传递源和目标路径(完整路径)包括文件夹/文件和扩展名)。 希望对你有所帮助!

 //ALLYOURNAMESPACESHERE using ... //SHARPLIB using ICSharpCode.SharpZipLib.Zip; using ICSharpCode.SharpZipLib.Zip.Compression.Streams; public static class FileUtils { ///  /// ///  ///  ///  public static void ZipFile(string sourcePath, string targetPath) { string tempZipFilePath = targetPath; using (FileStream tempFileStream = File.Create(tempZipFilePath, 1024)) { using (ZipOutputStream zipOutput = new ZipOutputStream(tempFileStream)) { // Zip with highest compression. zipOutput.SetLevel(9); DirectoryInfo directory = new DirectoryInfo(sourcePath); foreach (System.IO.FileInfo file in directory.GetFiles()) { // Get local path and create stream to it. String localFilename = file.FullName; //ignore directories or folders //ignore Thumbs.db file since this probably will throw an exception //another process could be using it. eg: Explorer.exe windows process if (!file.Name.Contains("Thumbs") && !Directory.Exists(localFilename)) { using (FileStream fileStream = new FileStream(localFilename, FileMode.Open, FileAccess.Read, FileShare.Read)) { // Read full stream to in-memory buffer. byte[] buffer = new byte[fileStream.Length]; fileStream.Read(buffer, 0, buffer.Length); // Create a new entry for the current file. ZipEntry entry = new ZipEntry(file.Name); entry.DateTime = DateTime.Now; // set Size and the crc, because the information // about the size and crc should be stored in the header // if it is not set it is automatically written in the footer. // (in this case size == crc == -1 in the header) // Some ZIP programs have problems with zip files that don't store // the size and crc in the header. entry.Size = fileStream.Length; fileStream.Close(); // Update entry and write to zip stream. zipOutput.PutNextEntry(entry); zipOutput.Write(buffer, 0, buffer.Length); // Get rid of the buffer, because this // is a huge impact on the memory usage. buffer = null; } } } // Finalize the zip output. zipOutput.Finish(); // Flushes the create and close. zipOutput.Flush(); zipOutput.Close(); } } } public static void unZipFile(string sourcePath, string targetPath) { if (!Directory.Exists(targetPath)) Directory.CreateDirectory(targetPath); using (ZipInputStream s = new ZipInputStream(File.OpenRead(sourcePath))) { ZipEntry theEntry; while ((theEntry = s.GetNextEntry()) != null) { if (theEntry.Name != String.Empty) { using (FileStream streamWriter = File.Create(targetPath + "\\" + theEntry.Name)) { int size = 2048; byte[] data = new byte[2048]; while (true) { size = s.Read(data, 0, data.Length); if (size > 0) { streamWriter.Write(data, 0, size); } else { break; } } } } } } } 

}