工具: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;
}