工具:ICSharpCode.SharpZipLib.dll
ICSharp只支持一级文件压缩,所以需要将子文件夹读出来根据路径压缩:
成员变量:
List<string> m_fileNames = new List<string>();
获取子文件夹:
public void GetChildFiles(string path)
{string[] fileNames = Directory.GetFiles(path);foreach(string fileName in fileNames){m_fileNames.Add(fileName);}string[] directoryNames = Directory.GetDirectories(path);if (directoryNames.Length > 0){foreach(string directoryName in directoryNames){GetChildFiles(directoryName);}}
}
压缩:
public int ZipFileMain(string[] args,string password)
{if(!Directory.Exists(args[0])){return -1; //指定进行压缩的目录不存在}ZipOutputStream s = null;FileStream fs = null;try{GetChildFiles(args[0]);string filedirectory = Path.GetDirectoryName(args[1]);if (!Directory.Exists(filedirectory))Directory.CreateDirectory(filedirectory);s = new ZipOutputStream(File.Create(args[1]));s.SetLevel(6);//s.Password = password;foreach (string file in m_fileNames){fs = File.OpenRead(file); //打开压缩文件byte[] buffer = new byte[fs.Length];fs.Read(buffer, 0, buffer.Length);ZipEntry entry = new ZipEntry(file.Substring(args[0].Length+1));entry.DateTime = DateTime.Now;entry.Size = fs.Length;s.PutNextEntry(entry);s.Write(buffer, 0, buffer.Length);if (fs != null)fs.Close();}}catch(Exception ex){if (fs != null)fs.Close();if(s!=null){s.Finish();s.Close();}return -1;}if (s != null){s.Finish();s.Close();}return 1;
}