压缩文件及文件夹。文件压缩很简单,把待压缩的文件用流的方式读到内存中,然后放到压缩流中。就可以了。文件夹就稍微麻烦下了。因为要把待压缩的文件夹解压后保留文件夹文件的层次结构。所以我的实现方式就是 递归遍历文件夹中的文件。计算其相对位置放到压缩流中。
代码如下
复制代码 代码如下:
/// <summary>
/// 压缩文件或者文件夹
/// </summary>
/// <param name="_depositPath">压缩后文件的存放路径 如C:\\windows\abc.zip</param>
/// <returns></returns>
public bool CompressionZip(string _depositPath)
{
bool result = true;
fileStream fs = null;
try
{
ZipOutputStream ComStream = new ZipOutputStream(file.Create(_depositPath));
ComStream.SetLevel(9); //压缩等级
foreach (string path in absolutePaths)
{
//如果是目录
if (Directory.Exists(path))
{
ZipFloder(path,ComStream,path);
}
else if (file.Exists(path))//如果是文件
{
fs = file.OpenRead(path);
byte[] bts = new byte[fs.Length];
fs.Read(bts,bts.Length);
ZipEntry ze = new ZipEntry(new fileInfo(path).name);
ComStream.PutNextEntry(ze); //为压缩文件流提供一个容器
ComStream.Write(bts,bts.Length); //写入字节
}
}
ComStream.Finish(); // 结束压缩
ComStream.Close();
}
catch (Exception ex)
{
if (fs != null)
{
fs.Close();
}
errorMsg = ex.Message;
result = false;
}
return result;
}
//压缩文件夹
private voID ZipFloder(string _OfloderPath,ZipOutputStream zos,string _floderPath)
{
foreach (fileSystemInfo item in new DirectoryInfo(_floderPath).GetfileSystemInfos())
{
if (Directory.Exists(item.Fullname))
{
ZipFloder(_OfloderPath,zos,item.Fullname);
}
else if (file.Exists(item.Fullname))//如果是文件
{
DirectoryInfo ODir = new DirectoryInfo(_OfloderPath);
string fullname2 = new fileInfo(item.Fullname).Fullname;
string path = ODir.name + fullname2.Substring(ODir.Fullname.Length,fullname2.Length - ODir.Fullname.Length);//获取相对目录
fileStream fs = file.OpenRead(fullname2);
byte[] bts = new byte[fs.Length];
fs.Read(bts,bts.Length);
ZipEntry ze = new ZipEntry(path);
zos.PutNextEntry(ze); //为压缩文件流提供一个容器
zos.Write(bts,bts.Length); //写入字节
}
}
}
关于解压 解压就简单多了。有文件解压文件,有文件夹 遍历,解压其中的文件。解压的文件中已经包含了其与文件夹的层次关系。
复制代码 代码如下:
/// <summary>
/// 解压
/// </summary>
/// <param name="_depositPath">压缩文件路径</param>
/// <param name="_floderPath">解压的路径</param>
/// <returns></returns>
public bool DeCompressionZip(string _depositPath,string _floderPath)
{
bool result = true;
fileStream fs=null;
try
{
ZipinputStream InpStream = new ZipinputStream(file.OpenRead(_depositPath));
ZipEntry ze = InpStream.GetNextEntry();//获取压缩文件中的每一个文件
Directory.CreateDirectory(_floderPath);//创建解压文件夹
while (ze != null)//如果解压完ze则是null
{
if (ze.Isfile)//压缩zipinputStream里面存的都是文件。带文件夹的文件名字是文件夹\\文件名
{
string[] strs=ze.name.Split('\\');//如果文件名中包含'\\‘则表明有文件夹
if (strs.Length > 1)
{
//两层循环用于一层一层创建文件夹
for (int i = 0; i < strs.Length-1; i++)
{
string floderPath=_floderPath;
for (int j = 0; j < i; j++)
{
floderPath = floderPath + "\\" + strs[j];
}
floderPath=floderPath+"\\"+strs[i];
Directory.CreateDirectory(floderPath);
}
}
fs = new fileStream(_floderPath+"\\"+ze.name,fileMode.OpenorCreate,fileAccess.Write);//创建文件
//循环读取文件到文件流中
while (true)
{
byte[] bts = new byte[1024];
int i= InpStream.Read(bts,bts.Length);
if (i > 0)
{
fs.Write(bts,i);
}
else
{
fs.Flush();
fs.Close();
break;
}
}
}
ze = InpStream.GetNextEntry();
}
}
catch (Exception ex)
{
if (fs != null)
{
fs.Close();
}
errorMsg = ex.Message;
result = false;
}
return result;
}
最后做个总结。C#作为高级语言,其强大的类库和第三方提供的类库。可以做很多事情。但也有弊端,用第三方类库性能不是很高。我压缩几百M的东西。cpu瞬间跑到50%多。比360压缩和zip压缩性能差远了。所以此类也就适用压缩比较小的东西。
完整例子下载地址
总结以上是内存溢出为你收集整理的C#中关于zip压缩解压帮助类的封装 附源码下载全部内容,希望文章能够帮你解决C#中关于zip压缩解压帮助类的封装 附源码下载所遇到的程序开发问题。
如果觉得内存溢出网站内容还不错,欢迎将内存溢出网站推荐给程序员好友。
欢迎分享,转载请注明来源:内存溢出
评论列表(0条)