研究了一下,如何把文件打包成Zip文件。

下面是我经历的进程:

1. 首先看到了微软本身的打包代码,是通过System.IO.Packaging 命令空间来进行打包,你可以点击以上的链接来查看其如何打包!其主要利用PackUriHelper.CreatePartUri来对文件

View Code

//  -------------------------- CreatePackage --------------------------
/// <summary>
///   Creates a package zip file containing specified
///   content and resource files.</summary>
private static void CreatePackage()
{// Convert system path and file names to Part URIs. In this example// Uri partUriDocument /* /Content/Document.xml */ =//     PackUriHelper.CreatePartUri(//         new Uri("Content\Document.xml", UriKind.Relative));// Uri partUriResource /* /Resources/Image1.jpg */ =//     PackUriHelper.CreatePartUri(//         new Uri("Resources\Image1.jpg", UriKind.Relative));Uri partUriDocument = PackUriHelper.CreatePartUri(new Uri(documentPath, UriKind.Relative));Uri partUriResource = PackUriHelper.CreatePartUri(new Uri(resourcePath, UriKind.Relative));// Create the Package// (If the package file already exists, FileMode.Create will//  automatically delete it first before creating a new one.//  The 'using' statement insures that 'package' is//  closed and disposed when it goes out of scope.)using (Package package =Package.Open(packagePath, FileMode.Create)){// Add the Document part to the PackagePackagePart packagePartDocument =package.CreatePart(partUriDocument,System.Net.Mime.MediaTypeNames.Text.Xml);// Copy the data to the Document Partusing (FileStream fileStream = new FileStream(documentPath, FileMode.Open, FileAccess.Read)){CopyStream(fileStream, packagePartDocument.GetStream());}// end:using(fileStream) - Close and dispose fileStream.// Add a Package Relationship to the Document Part
        package.CreateRelationship(packagePartDocument.Uri,TargetMode.Internal,PackageRelationshipType);// Add a Resource Part to the PackagePackagePart packagePartResource =package.CreatePart(partUriResource,System.Net.Mime.MediaTypeNames.Image.Jpeg);// Copy the data to the Resource Partusing (FileStream fileStream = new FileStream(resourcePath, FileMode.Open, FileAccess.Read)){CopyStream(fileStream, packagePartResource.GetStream());}// end:using(fileStream) - Close and dispose fileStream.// Add Relationship from the Document part to the Resource part
        packagePartDocument.CreateRelationship(new Uri(@"../resources/image1.jpg",UriKind.Relative),TargetMode.Internal,ResourceRelationshipType);}// end:using (Package package) - Close and dispose package.

}// end:CreatePackage()//  --------------------------- CopyStream ---------------------------
/// <summary>
///   Copies data from a source stream to a target stream.</summary>
/// <param name="source">
///   The source stream to copy from.</param>
/// <param name="target">
///   The destination stream to copy to.</param>
private static void CopyStream(Stream source, Stream target)
{const int bufSize = 0x1000;byte[] buf = new byte[bufSize];int bytesRead = 0;while ((bytesRead = source.Read(buf, 0, bufSize)) > 0)target.Write(buf, 0, bytesRead);
}// end:CopyStream()

其打包的文件打包后会有一个Relationship,还有一些额外的关联文件(想除掉,但不知怎么删除掉),如.rels文件夹和.rels.xml文件,我很不喜欢,所以也没有时间花更多的时间去三研究对文件夹进行打包。
在你看Microsoft 的实例 中,打包过程还需要知道打包的文件的ContentType,这个可以通过以下代码来解决!

private string GetContentType(string fileName) { string contentType = "application/octetstream"; string ext = System.IO.Path.GetExtension(fileName).ToLower(); Microsoft.Win32.RegistryKey registryKey = Microsoft.Win32.Registry.ClassesRoot.OpenSubKey(ext); if (registryKey != null && registryKey.GetValue("Content Type") != null) contentType = registryKey.GetValue("Content Type").ToString(); return contentType;
}  

你可以通过点击以上链接来查看如何打包压缩及解压缩

PackageRead    PackageWrite

2. 网上查找的,通过Utilities命令空间来守成的,其主要用到两个类

ZipFile.cs

View Code

#region  Usings
using System;
using System.Collections.Generic;
using System.Linq;
using System.Text;
using System.IO.Packaging;
using System.IO;
using System.Web;
using Microsoft.Build.Utilities;#endregion
namespace Utilities.FileFormats.Zip
{/// <summary>  /// /// Helper class for dealing with zip files/// /// </summary>  public class ZipFile : IDisposable{#region Constructor/// <summary>  /// /// Constructo     /// </summary> /// <param name="FilePath">Path to the zip file</param>/// /// <param name="Overwrite">Should the zip file be overwritten?</param>  public ZipFile(string FilePath, bool Overwrite){if (string.IsNullOrEmpty(FilePath))throw new ArgumentNullException("FilePath");ZipFileStream = new FileStream(FilePath, Overwrite ? FileMode.Create : FileMode.OpenOrCreate);}#endregion#region Properties/// <summary>  /// /// Zip file's FileStream  /// /// </summary> protected virtual FileStream ZipFileStream { get; set; }#endregion#region Functions/// <summary>/// Adds a folder to the zip file /// /// </summary> /// /// <param name="Folder">Folder to add</param>  public virtual void AddFolder(string Folder){if (string.IsNullOrEmpty(Folder))throw new ArgumentNullException("Folder");if (Folder.EndsWith(@"\"))Folder = Folder.Remove(Folder.Length - 1);using (Package Package = ZipPackage.Open(ZipFileStream, FileMode.OpenOrCreate)){List<FileInfo> Files = Utilities.IO.FileManager.FileList(Folder, true);foreach (FileInfo File in Files){string FilePath = File.FullName.Replace(Folder, "");AddFile(FilePath, File, Package);}}}/// <summary>  /// Adds a file to the zip file  88:  /// </summary> /// <param name="File">File to add</param>  public virtual void AddFile(string File){if (string.IsNullOrEmpty(File))throw new ArgumentNullException("File");if (!Utilities.IO.FileManager.FileExists(File))throw new ArgumentException("File");using (Package Package = ZipPackage.Open(ZipFileStream)){AddFile(File, new FileInfo(File), Package);}}/// <summary> /// Uncompresses the zip file to the specified folder /// </summary> /// <param name="Folder">Folder to uncompress the file in</param> public virtual void UncompressFile(string Folder){if (string.IsNullOrEmpty(Folder))throw new ArgumentNullException(Folder);Utilities.IO.FileManager.CreateDirectory(Folder);using (Package Package = ZipPackage.Open(ZipFileStream, FileMode.Open, FileAccess.Read)){foreach (PackageRelationship Relationship in Package.GetRelationshipsByType("http://schemas.microsoft.com/opc/2006/sample/document")){Uri UriTarget = PackUriHelper.ResolvePartUri(new Uri("/", UriKind.Relative), Relationship.TargetUri);PackagePart Document = Package.GetPart(UriTarget);Extract(Document, Folder);}if (File.Exists(Folder + @"\[Content_Types].xml"))File.Delete(Folder + @"\[Content_Types].xml");}}/// <summary> /// /// Extracts an individual file///  </summary> /// <param name="Document">Document to extract</param> /// <param name="Folder">Folder to extract it into</param> protected virtual void Extract(PackagePart Document, string Folder){if (string.IsNullOrEmpty(Folder))throw new ArgumentNullException(Folder);string Location = Folder + System.Web.HttpUtility.UrlDecode(Document.Uri.ToString()).Replace('\\', '/');Utilities.IO.FileManager.CreateDirectory(Path.GetDirectoryName(Location));byte[] Data = new byte[1024];using (FileStream FileStream = new FileStream(Location, FileMode.Create)){Stream DocumentStream = Document.GetStream();while (true){int Size = DocumentStream.Read(Data, 0, 1024);FileStream.Write(Data, 0, Size);if (Size != 1024)break;}FileStream.Close();}}/// <summary> /// /// Adds a file to the zip file /// /// </summary> /// /// <param name="File">File to add</param> /// /// <param name="FileInfo">File information</param> /// /// <param name="Package">Package to add the file to</param> protected virtual void AddFile(string File, FileInfo FileInfo, Package Package){if (string.IsNullOrEmpty(File))throw new ArgumentNullException("File");if (!Utilities.IO.FileManager.FileExists(FileInfo.FullName))throw new ArgumentException("File");Uri UriPath = PackUriHelper.CreatePartUri(new Uri(File, UriKind.Relative));PackagePart PackagePart = Package.CreatePart(UriPath, System.Net.Mime.MediaTypeNames.Text.Xml, CompressionOption.Maximum);byte[] Data = null;Utilities.IO.FileManager.GetFileContents(FileInfo.FullName, out Data);PackagePart.GetStream().Write(Data, 0, Data.Count());Package.CreateRelationship(PackagePart.Uri, TargetMode.Internal, "http://schemas.microsoft.com/opc/2006/sample/document");}#endregion#region IDisposable Memberspublic void Dispose(){if (ZipFileStream != null){ZipFileStream.Close();ZipFileStream.Dispose();ZipFileStream = null;}}#endregion}
}

FileManager.cs

View Code

#region Usings
using System;
using System.Collections.Generic;
using System.IO;
using System.Net;
using System.Text;#endregionnamespace Utilities.IO
{public static class FileManager{#region Public Static Functions#region SaveFilepublic static void SaveFile(string Content, string FileName, bool Append = false){FileStream Writer = null;try{byte[] ContentBytes = Encoding.UTF8.GetBytes(Content);int Index = FileName.LastIndexOf('/');if (Index <= 0){Index = FileName.LastIndexOf('\\');}if (Index <= 0){throw new Exception("Directory must be specified for the file");}string Directory = FileName.Remove(Index) + "/";if (!DirectoryExists(Directory)){CreateDirectory(Directory);}bool Opened = false;while (!Opened){try{if (Append){Writer = File.Open(FileName, FileMode.Append, FileAccess.Write, FileShare.None);}else{Writer = File.Open(FileName, FileMode.Create, FileAccess.Write, FileShare.None);}Opened = true;}catch (System.IO.IOException) { throw; }}Writer.Write(ContentBytes, 0, ContentBytes.Length);Writer.Close();}catch { throw; }finally{if (Writer != null){Writer.Close();Writer.Dispose();}}}public static void SaveFile(string Content, string FileName, Uri FTPServer, string UserName, string Password){Uri TempURI = new Uri(Path.Combine(FTPServer.ToString(), FileName));FtpWebRequest FTPRequest = (FtpWebRequest)FtpWebRequest.Create(TempURI);FTPRequest.Credentials = new NetworkCredential(UserName, Password);FTPRequest.KeepAlive = false;FTPRequest.Method = WebRequestMethods.Ftp.UploadFile;FTPRequest.UseBinary = true;FTPRequest.ContentLength = Content.Length;FTPRequest.Proxy = null;using (Stream TempStream = FTPRequest.GetRequestStream()){System.Text.ASCIIEncoding TempEncoding = new System.Text.ASCIIEncoding();byte[] TempBytes = TempEncoding.GetBytes(Content);TempStream.Write(TempBytes, 0, TempBytes.Length);}FTPRequest.GetResponse();}public static void SaveFile(byte[] Content, string FileName, bool Append = false){FileStream Writer = null;try{int Index = FileName.LastIndexOf('/');if (Index <= 0){Index = FileName.LastIndexOf('\\');}if (Index <= 0){throw new Exception("Directory must be specified for the file");}string Directory = FileName.Remove(Index) + "/";if (!DirectoryExists(Directory)){CreateDirectory(Directory);}bool Opened = false;while (!Opened){try{if (Append){Writer = File.Open(FileName, FileMode.Append, FileAccess.Write, FileShare.None);}else{Writer = File.Open(FileName, FileMode.Create, FileAccess.Write, FileShare.None);}Opened = true;}catch (System.IO.IOException) { throw; }}Writer.Write(Content, 0, Content.Length);Writer.Close();}catch { throw; }finally{if (Writer != null){Writer.Close();Writer.Dispose();}}}#endregion#region Deletepublic static void Delete(string FileName){File.Delete(FileName);}#endregion#region RenameFilepublic static void RenameFile(string FileName, string NewFileName){File.Move(FileName, NewFileName);}#endregion#region DirectoryExistspublic static bool DirectoryExists(string DirectoryPath){return Directory.Exists(DirectoryPath);}#endregion#region FileExistspublic static bool FileExists(string FileName){return File.Exists(FileName);}#endregion#region DirectoryListpublic static List<DirectoryInfo> DirectoryList(string DirectoryPath){List<DirectoryInfo> Directories = new List<DirectoryInfo>();if (DirectoryExists(DirectoryPath)){DirectoryInfo Directory = new DirectoryInfo(DirectoryPath);DirectoryInfo[] SubDirectories = Directory.GetDirectories();foreach (DirectoryInfo SubDirectory in SubDirectories){Directories.Add(SubDirectory);}}return Directories;}#endregion#region CreateDirectorypublic static void CreateDirectory(string DirectoryPath){Directory.CreateDirectory(DirectoryPath);}#endregion#region DeleteDirectorypublic static void DeleteDirectory(string DirectoryPath){Directory.Delete(DirectoryPath, true);}#endregion#region FileListpublic static List<FileInfo> FileList(string DirectoryPath, bool Recursive = false){List<FileInfo> Files = new List<FileInfo>();if (DirectoryExists(DirectoryPath)){DirectoryInfo Directory = new DirectoryInfo(DirectoryPath);FileInfo[] SubFiles = Directory.GetFiles();foreach (FileInfo SubFile in SubFiles){Files.Add(SubFile);}if (Recursive){DirectoryInfo[] SubDirectories = Directory.GetDirectories();foreach (DirectoryInfo SubDirectory in SubDirectories){List<FileInfo> TempFiles = FileList(SubDirectory.FullName, true);foreach (FileInfo File in TempFiles){Files.Add(File);}}}}return Files;}#endregion#region GetFileContentspublic static string GetFileContents(string FileName){return GetFileContents(FileName, 5000);}public static string GetFileContents(string FileName, int TimeOut){StreamReader Reader = null;int StartTime = System.Environment.TickCount;try{if (!FileExists(FileName))return "";bool Opened = false;while (!Opened){try{if (System.Environment.TickCount - StartTime >= TimeOut)throw new System.IO.IOException("File opening timed out");Reader = File.OpenText(FileName);Opened = true;}catch (System.IO.IOException) { throw; }}string Contents = Reader.ReadToEnd();Reader.Close();return Contents;}catch { throw; }finally{if (Reader != null){Reader.Close();Reader.Dispose();}}}public static void GetFileContents(string FileName, out byte[] Output, int TimeOut){FileStream Reader = null;int StartTime = System.Environment.TickCount;try{if (!FileExists(FileName)){Output = null;return;}bool Opened = false;while (!Opened){try{if (System.Environment.TickCount - StartTime >= TimeOut)throw new System.IO.IOException("File opening timed out");Reader = File.OpenRead(FileName);Opened = true;}catch (System.IO.IOException) { throw; }}byte[] Buffer = new byte[1024];using (MemoryStream TempReader = new MemoryStream()){while (Reader.Read(Buffer, 0, 1024) == 1024){TempReader.Write(Buffer, 0, Buffer.Length);}Reader.Close();Output = TempReader.ToArray();TempReader.Close();}}catch{Output = null;throw;}finally{if (Reader != null){Reader.Close();Reader.Dispose();}}}public static string GetFileContents(Uri FileName){using (WebClient Client = new WebClient()){using (StreamReader Reader = new StreamReader(Client.OpenRead(FileName))){string Contents = Reader.ReadToEnd();Reader.Close();return Contents;}}}public static void GetFileContents(Uri FileName, out Stream OutputStream, out WebClient Client){Client = new WebClient();OutputStream = Client.OpenRead(FileName);}public static string GetFileContents(Uri FileName, string UserName, string Password){using (WebClient Client = new WebClient()){Client.Credentials = new NetworkCredential(UserName, Password);using (StreamReader Reader = new StreamReader(Client.OpenRead(FileName))){string Contents = Reader.ReadToEnd();Reader.Close();return Contents;}}}public static void GetFileContents(Uri FileName, string UserName, string Password, out Stream OutputStream, out WebClient Client){Client = new WebClient();Client.Credentials = new NetworkCredential(UserName, Password);OutputStream = Client.OpenRead(FileName);}public static void GetFileContents(string FileName, out byte[] Output){GetFileContents(FileName, out Output, 5000);}#endregion#region CopyDirectorypublic static void CopyDirectory(string Source, string Destination, bool Recursive, CopyOptions Options){DirectoryInfo SourceInfo = new DirectoryInfo(Source);DirectoryInfo DestinationInfo = new DirectoryInfo(Destination);if (!DirectoryExists(Destination)){CreateDirectory(Destination);}List<FileInfo> Files = FileList(Source);foreach (FileInfo File in Files){if (Options == CopyOptions.CopyAlways){File.CopyTo(Path.Combine(DestinationInfo.FullName, File.Name), true);}else if (Options == CopyOptions.CopyIfNewer){if (FileExists(Path.Combine(DestinationInfo.FullName, File.Name))){FileInfo FileInfo = new FileInfo(Path.Combine(DestinationInfo.FullName, File.Name));if (FileInfo.LastWriteTime.CompareTo(File.LastWriteTime) < 0){File.CopyTo(Path.Combine(DestinationInfo.FullName, File.Name), true);}}else{File.CopyTo(Path.Combine(DestinationInfo.FullName, File.Name), true);}}else if (Options == CopyOptions.DoNotOverwrite){File.CopyTo(Path.Combine(DestinationInfo.FullName, File.Name), false);}}if (Recursive){List<DirectoryInfo> Directories = DirectoryList(SourceInfo.FullName);foreach (DirectoryInfo Directory in Directories){CopyDirectory(Directory.FullName, Path.Combine(DestinationInfo.FullName, Directory.Name), Recursive, Options);}}}#endregion#region GetDirectorySizepublic static long GetDirectorySize(string Directory, bool Recursive){long Size = 0;List<FileInfo> Files = FileManager.FileList(Directory, Recursive);foreach (FileInfo File in Files){Size += File.Length;}return Size;}#endregion#region DeleteFilesOlderThanpublic static void DeleteFilesOlderThan(string Directory, DateTime CompareDate, bool Recursive){List<FileInfo> Files = FileManager.FileList(Directory, Recursive);foreach (FileInfo File in Files){if (File.LastWriteTime < CompareDate){FileManager.Delete(File.FullName);}}}#endregion#region DeleteFilesNewerThanpublic static void DeleteFilesNewerThan(string Directory, DateTime CompareDate, bool Recursive){List<FileInfo> Files = FileManager.FileList(Directory, Recursive);foreach (FileInfo File in Files){if (File.LastWriteTime > CompareDate){FileManager.Delete(File.FullName);}}}#endregion#region CompareFilespublic static bool CompareFiles(string FileName1, string FileName2){FileInfo File1 = new FileInfo(FileName1);FileInfo File2 = new FileInfo(FileName2);if (File1.Length != File2.Length){return false;}string File1Contents = FileManager.GetFileContents(FileName1);string File2Contents = FileManager.GetFileContents(FileName2);if (!File1Contents.Equals(File2Contents))return false;return true;}#endregion#endregion}#region Enumspublic enum CopyOptions{CopyIfNewer,CopyAlways,DoNotOverwrite}#endregion
}

下面是用Console Application来使用例子

                using (Utilities.FileFormats.Zip.ZipFile File = new Utilities.FileFormats.Zip.ZipFile(@"E:\ZIPFILENAME.zip", true)) {File.AddFolder(@"E:\Emp");File.AddFolder(@"E:\360Downloads\Silverlight");}Console.WriteLine("Success");Console.ReadKey();

这两个类,其实也是根据MIcrosoft中Packing类,就是第一种 方法,然后使其能对整个文件进行打包,但其AddFile方法不能成功!很可惜,不过这个应该不是大问题,估计花点时间还是会其调试好的。

这两个类打包后的文件其也有像第一种方法那样,有关联文件,而且没有去掉,估计其写这代码的人也暂时没有办法去掉,所以我也舍弃掉了!

主要参考了以下网址

Creating a Zip File in C#:http://www.gutgames.com/post/Creating-a-Zip-File-in-C.aspx

辅助类地址:http://www.quebeclogiciel.com/csUtil/Documentation/html/_file_manager_8cs_source.html

3. 用开源的SharpZipLib Library 来打包,这个可以打包,而且没有关联文件,根据这个类库,我改写和编写一个常用的类来打包及解压,下面是这个类的代码

Packing.cs

View Code

    public class GPacking{private List<FileInfo> GetFileList(string sDirectoryPath, PackingScope scope){List<FileInfo> filesInfo = new List<FileInfo>();DirectoryInfo dir = new DirectoryInfo(sDirectoryPath);if (scope != PackingScope.Folder){FileInfo[] files = dir.GetFiles();foreach (FileInfo fTemp in files){filesInfo.Add(fTemp);}}if (scope != PackingScope.File){DirectoryInfo[] dirs = dir.GetDirectories();foreach (DirectoryInfo dirTemp in dirs){List<FileInfo> templist = GetFileList(dirTemp.FullName, PackingScope.All);foreach (FileInfo fileTemp in templist){filesInfo.Add(fileTemp);}}}return filesInfo;}/// <summary>/// 把文件夹里面的文件为一个压缩包文件/// </summary>/// <param name="sDirectoryPath">需要打包的目录</param>/// <param name="FileName">打包之后保存的文件名称,如D:\packing.zip</param>/// <param name="scope">打包的范围</param>/// <returns></returns>public bool ToFile(string sDirectoryPath, string FileName, PackingScope scope){bool result = false;List<FileInfo> filesInfo = new List<FileInfo>();Crc32 crc = new Crc32();ZipOutputStream s = null;int i = 1;try{FileInfo filedd = new FileInfo(FileName);if (!Directory.Exists(filedd.Directory.FullName)){Directory.CreateDirectory(filedd.Directory.FullName);}s = new ZipOutputStream(File.OpenWrite(FileName));s.SetLevel(9);DirectoryInfo mainDir = new DirectoryInfo(sDirectoryPath);filesInfo = GetFileList(mainDir.FullName, scope);foreach (FileInfo file in filesInfo){using (FileStream fs = File.OpenRead(file.FullName)){byte[] buffer = new byte[fs.Length];fs.Read(buffer, 0, buffer.Length);ZipEntry entry = new ZipEntry(ZipEntry.CleanName(file.FullName.Replace(mainDir.FullName + "\\", "")));entry.DateTime = DateTime.Now;entry.Comment = i.ToString();entry.ZipFileIndex = i++;entry.Size = fs.Length;fs.Close();crc.Reset();crc.Update(buffer);entry.Crc = crc.Value;s.PutNextEntry(entry);s.Write(buffer, 0, buffer.Length);}}s.Finish();s.Close();}catch (Exception ex){throw new Exception(ex.Message);}finally{s.Close();}return result;}/// <summary>/// 把一个文件打包/// </summary>/// <param name="sFileFullPath">文件的全路径</param>/// <param name="FileName">打包之后保存的文件名称</param>/// <returns></returns>public bool ToFile(string sFileFullPath, string FileName){bool result = false;Crc32 crc = new Crc32();ZipOutputStream s = null;int i = 1;try{FileInfo filedd = new FileInfo(FileName);//DirectoryInfo mainDir = new DirectoryInfo(sDirectoryPath);if (!Directory.Exists(filedd.Directory.FullName)){Directory.CreateDirectory(filedd.Directory.FullName);}s = new ZipOutputStream(File.OpenWrite(FileName));s.SetLevel(9);FileInfo file = new FileInfo(sFileFullPath);using (FileStream fs = File.OpenRead(file.FullName)){byte[] buffer = new byte[fs.Length];fs.Read(buffer, 0, buffer.Length);ZipEntry entry = new ZipEntry(ZipEntry.CleanName(file.Name));entry.DateTime = DateTime.Now;entry.Comment = i.ToString();entry.ZipFileIndex = i++;entry.Size = fs.Length;fs.Close();crc.Reset();crc.Update(buffer);entry.Crc = crc.Value;s.PutNextEntry(entry);s.Write(buffer, 0, buffer.Length);}s.Finish();s.Close();}catch (Exception ex){throw new Exception(ex.Message);}finally{s.Close();}return result;}/// <summary>/// 解压文件/// </summary>/// <param name="zipPathAndFile">需要解压文件的路径</param>/// <param name="outputFolder">解压到哪里</param>/// <param name="deleteZipFile">是否删除</param>public void UnZipFiles(string zipPathAndFile, string outputFolder, bool  deleteZipFile){ZipInputStream s = new ZipInputStream(File.OpenRead(zipPathAndFile));ZipEntry theEntry;string tmpEntry = String.Empty;while ((theEntry = s.GetNextEntry()) != null){string directoryName = outputFolder;string fileName = Path.GetFileName(theEntry.Name);// create directory if (directoryName != ""){Directory.CreateDirectory(directoryName);}if (fileName != String.Empty){if (theEntry.Name.IndexOf(".ini") < 0){string fullPath = directoryName + "\\" + theEntry.Name;fullPath = fullPath.Replace("\\ ", "\\");string fullDirPath = Path.GetDirectoryName(fullPath);if (!Directory.Exists(fullDirPath)) Directory.CreateDirectory(fullDirPath);Console.WriteLine(System.Web.HttpUtility.UrlDecode(fullPath));FileStream streamWriter = File.Create(System.Web.HttpUtility.UrlDecode(fullPath));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;}}streamWriter.Close();}}}s.Close();if (deleteZipFile)File.Delete(zipPathAndFile);}}public enum PackingScope{Folder,File,All}

在Packing里需 引用以下命名空间:

using System.Text;
using System.IO;
using ICSharpCode.SharpZipLib.Zip;
using ICSharpCode.SharpZipLib.Checksums;

其中ICShareCode开头的命令空间,你可以通过以下参考地址来查看其源代码,或者你可以通过以下链接来下载,我已经编译好的DLL文件
ICSharpCode.SharpZipLib.zip 

引用DLL后你可以通以下代码来实现解压与打包

            GPacking gpk = new GPacking();gpk.ToFile(@"E:\WebApplication1\bin\Emp", @"e:\abc\mypp.rar", PackingScope.File);Console.WriteLine("Success");//gpk.UnZipFiles(@"E:\abc\asfsa\ZIPFILENAME.zip",@"E:\dd",true);//Console.WriteLine("Success");Console.ReadKey();

下面详细地讲解阐述一下我现在用的这个类的一些参数及方法

PackingScope: 这个是打包的范围,有三种可能File,Folder,All (这是我自己定义的枚举例子),File表示只打包这个要打包文件夹的根目录的文件(不包含文件夹,及文件夹的子文件), Folder表示只打包要打包文件夹的子文件夹及子文件夹的文件,文件夹即除了File打包的的所有文件), ALL表示其所有的都打包。

另一重载方法中ToFile(只打包单一的文件)

下面是库源文件的地址和在开发过程中参考的地址:

源文件下载地址及帮助文档地址:http://www.icsharpcode.net/OpenSource/SharpZipLib/Download.aspx

这个库的参考打包代码地址:http://geekswithblogs.net/twickers/archive/2005/11/08/59420.aspx

解压及打包文件参考地址:http://www.eggheadcafe.com/tutorials/csharp/9ce6c242-c14c-4969-9251-af95e4cf320f/zip--unzip-folders-and-files-with-c.aspx

转载于:https://www.cnblogs.com/gzh4455/archive/2012/05/10/2494878.html

文件打包成zip类型文件相关推荐

  1. python打包zip文件_python 解压文件,合并文件 打包成zip格式文件 生成MD5值

    #!/usr/bin/env python #_*_encoding:utf-8 # 2018/05/29 #augustyang #2.0 ''' 解压文件,合并文件 打包成zip格式文件 生成MD ...

  2. python打包成二进制文件_pyinstall python文件打包成二进制exe文件

    pycharm + python3 + win7 1 pip install pyinstall  (官网) 2 准备 .py 文件 3 具体例子 from PyQt5.QtWidgets impor ...

  3. think.class.php下载,PHP_ThinkPHP实现将本地文件打包成zip下载,首先,将FileToZip.class文件放到T - phpStudy...

    ThinkPHP实现将本地文件打包成zip下载 首先,将FileToZip.class文件放到ThinkPHP/Extend/Library/ORG/Util/文件夹中,FileToZip.class ...

  4. 关于springmvc下服务器文件打包成zip格式下载功能

    关于springmvc下服务器文件打包成zip格式下载功能 2016年09月21日 11:22:14 toxic_guantou 阅读数:5731更多 个人分类: 技术点存储 版权声明:本文为博主原创 ...

  5. java 文件流的处理 文件打包成zip

    1.下载文件到本地 public void download(HttpServletResponse response){String filePath ="";//文件路径Str ...

  6. java 把文件打包成zip_java 文件流的处理 文件打包成zip

    1.下载文件到本地 public void download(HttpServletResponse response){ String filePath ="";//文件路径 S ...

  7. SpringBoot将文件打包成zip存放或导出

    目录 前言 环境准备 将文件打包成Zip存放 代码 测试 将文件打包成zip并导出 代码 测试 结尾 前言 相信各位看官在工作中都会遇到过要把多个文件打包成一个压缩文件然后导出,或者将文件打包成Zip ...

  8. Java将多个文件打包成ZIP并下载

    Java将多个文件打包成ZIP并下载 需求是多个文件需要同时打包成zip压缩文件并下载到本地,首先我需要的是知道下载文件的路径.我有一个专门的sys_file_info表,表中有对应的文件路径.业务表 ...

  9. php 生成zip并下载,PHP 实现文件打包成zip格式并下载

    PHP 文件打包并下载 有个这样的需求,将多个文件打包成zip格式并下载到本地 可根据 ZipArchive这个类来实现此功能 我自己也研究了一下,然后把搞出来了 ,经测试绝对好用 话不多说直接上代码 ...

最新文章

  1. 万万没想到! logger.info() 还能导致线上故障?
  2. golang 随机数 math/rand包 crypto/rand包
  3. 2016去哪儿编程题:乘坐公交
  4. Intellij IDEA关闭 Build窗口提示
  5. c语言osversioninfoex,xi52qian
  6. startindex 不能大于字符串长度_「12」学习MySQL第二类函数:字符串函数
  7. 新基建浪潮下,看边缘计算+5G如何乘风破浪
  8. redis学习篇(九)-----高级特性之事务处理
  9. ASP.NET简化编辑界面 V2
  10. JavaScript 系列笔记(一)数据类型
  11. (转)1.43亿用户信息泄露案后 美国征信机构CEO离职
  12. DelayedWorkQueue踩坑笔记
  13. java数组的定义(菜鸟教程)
  14. 点云数据实时在线浏览共享与逆向建模应用
  15. sleep() 和 wait() 有什么区别
  16. 桌面便利贴软件下载 电脑桌面便签小工具软件下载
  17. MYSQL彻底卸载(步步图解)
  18. [MicroPython]STM32F407开发板DIY声光控开关
  19. 新消费品牌如何发力KOL营销
  20. web请求流程与HTTP方法刨析

热门文章

  1. 问答平台元老Yahoo Answers宣布将永久关闭,网友:爷青结
  2. 用这种方式,我每次都是朋友圈里第一个预见AI科技趋势的人
  3. 英伟达一大波硬件来袭:今日GTC发布专业GPU与DPU,为收购ARM将在英国建超算
  4. 56岁潘石屹报名全国青少年编程能力等级测试,昔日地产大亨,今陷Python难抽身...
  5. 深度学习已成强弩之末?Bengio等大牛NeurlPS2019上支招
  6. 孙剑:旷视不需要用冠军证明自己;看好自动机器学习技术
  7. 中国无人车公司AutoX,打响加州RoboTaxi服务第一枪
  8. vue 数据劫持详解
  9. 寻找项目中顶级Vue对象 (一)
  10. Vue报错:Uncaught TypeError: Cannot assign to read only property’exports‘ of object’#Object‘的解决方法...