C# 之 ZipOutPutStream 压缩文件

前言

有段日子没写跟代码有关的博客了,这段时间碰上了不少坑,我自己有拿小本本记下来,但是我觉得大部分没有写上来的必要,因为这些实在太常见了,网上一搜一大堆写的几乎一样的博客、文章,没必要再写出来,那些碰上的事,经过与实际情况下检测是能够解决问题的,毕竟也过滤的了很多的东西才总结出来,或者说是成功的解决了问题,后续我会把我认为有价值的或者采用他人的方法解决了的问题在进行总结后搬上来。

下面给大家提供一段文件压缩实现代码:

//需要引用到 ICSharpCode.SharpZipLib 类库来实现文件压缩,你可以通过Nuget来安装此类库,或者到搜索引擎去搜索并下载添加到项目引用

/// 
/// 压缩文件
/// 		
/// 压缩后获得的文件名  
public static bool CompressFile(out string fileName)
{
    string dest = System.Environment.GetFolderPath(System.Environment.SpecialFolder.Desktop) + "\\" + string.Format("{0:yyyyMMddHHmmss}", DateTime.Now) + ".zip";   //默认压缩在桌面上
    if (!Directory.Exists(Path.GetDirectoryName(dest)))   //文件不存在就根据路径创建  E:\\test
      	 Directory.CreateDirectory(Path.GetDirectoryName(dest));
     using (ZipOutputStream zipStream = new ZipOutputStream(File.Create(dest)))
     {
         zipStream.SetLevel(6);   //压缩级别0-9  
         CreateZip(logDir, zipStream);
         fileName = dest;
         zipStream.Finish();
         zipStream.Close();
     }
     return true;
  }
/// 
/// 压缩内容到 zipStream 流中 
/// 		
/// 源文件  
/// 目标文件流(全路径+文件名+.zip)

private static void CreateZip(string source, ZipOutputStream zipStream)
{
    Crc32 crc = new Crc32();
    string[] files = Directory.GetFileSystemEntries(source);  //获得所有文件名称和目录名称
    foreach (var file in files)
    {
        if (Directory.Exists(file))    //如果是文件夹里有文件则递归
        {
            CreateZip(file, zipStream);
        }
        else    //如果不是则压缩
        {
            using (FileStream fs = File.OpenRead(file))
            {
                byte[] buffer = new byte[fs.Length];
                fs.Read(buffer, 0, buffer.Length);
                string tempFileName = file.Substring(file.LastIndexOf("\\") + 1);  //获得当前文件路径的文件名
                ZipEntry entry = new ZipEntry(tempFileName);
                entry.DateTime = DateTime.Now;
                entry.Size = fs.Length;
                fs.Close();
                crc.Reset();
                crc.Update(buffer);
                entry.Crc = crc.Value;
                zipStream.PutNextEntry(entry);
                zipStream.Write(buffer, 0, buffer.Length);
            }
        }
    }
}

其他压缩(没完全举例完):

  • 使用 FastZip - - - 局限性就是只能压缩文件夹。(该类只有两个方法:CreateZip 压缩目录 ExtractZip 解压缩目录)
  • 使用 ZipOutputStream - - -
    ZipOutputStream:相当于一个压缩包;
    ZipEntry:相当于压缩包里的一个文件;

如有不当,请在下方评论交流,

你可能感兴趣的:(C#)