C# 文件/文件夹压缩

摘要:
因此,如果压缩包中有文件,原始压缩文件将不会更改,而是添加到会议中。示例3:读取压缩包中的文件:使用{foreach{Console.WriteLine;}ZipEntryz1=zip[0];Console.WriteLine;}2、 FastZip类有两个方法:方法描述:CreateZip压缩目录ExtractZip解压缩目录1。FastZip用于快速压缩目录。示例如下follows://Fast压缩目录,包括目录下的所有文件。CreateZip;这是递归压缩。
一、ZipFile

  ZipFile类用于选择文件或文件夹进行压缩生成压缩包。

  常用属性:

属性说明
Count文件数目(注意是在ComitUpdat之后才有)
Password压缩包密码
Size压缩包占用空间大小
Name压缩包名称,默认输出是文件路径
ZipEntry压缩包里的文件,通过索引[]访问

  其常用方法如下:

方法说明
Add添加要进行压缩的文件
AddDirectory添加文件夹(不会压缩文件夹里的文件)
Delete删除文件或文件夹
BeginUpdate开始修改压缩包
CommitUpdate提交修改
SetComment添加注释

  示例1(创建压缩文件):

复制代码
  using (ZipFile zip = ZipFile.Create(@"D:	est.zip"))
    {
          zip.BeginUpdate();
      zip.SetComment("这是我的压缩包"); zip.Add(
@"D:1.txt"); //添加一个文件 zip.AddDirectory(@"D:2"); //添加一个文件夹(这个方法不会压缩文件夹里的文件) zip.Add(@"D:22.txt"); //添加文件夹里的文件 zip.CommitUpdate(); }
复制代码

  这样生成的压缩包是包含子文件夹,子文件夹也是包含子文件的。

  其中,注释如下:

  C# 文件/文件夹压缩第3张

  示例2:修改压缩包

  using (ZipFile zip = new ZipFile(@"D:	est.zip"))
      {
          zip.BeginUpdate();
          zip.Add(@"D:2.txt");
          zip.CommitUpdate();
      }

  留意这个示例和上面的有什么不同,上面的是Create方法创建的ZipFile对象,而这里是直接读。因此,如果压缩包里面有文件,则不会改动原来的压缩文件,而是往会里面添加一个。这样就相当于压缩包的修改,而上面是压缩包的创建。

  示例3:读取压缩包里的文件:

复制代码
  using (ZipFile zip = new ZipFile(@"D:	est.zip"))
      {
          foreach (ZipEntry z in zip)
          {
              Console.WriteLine(z);
          }
          ZipEntry z1 = zip[0];
          Console.WriteLine(z1.Name);
     }
复制代码
二、FastZip

  这个类就两个方法:

方法说明
CreateZip压缩目录
ExtractZip解压缩目录

  

  1、FastZip用于快速压缩目录,示例如下:

//快速压缩目录,包括目录下的所有文件
(new FastZip()).CreateZip(@"D:	est.zip", @"D:	est", true, "");

  这个是递归压缩的。但是局限性就是只能压缩文件夹。

  否则报如下错误:

  C# 文件/文件夹压缩第6张

  2、快速解压缩目录

//快速解压
(new FastZip()).ExtractZip(@"D:	est.zip", @"D:解压目录", "");
三、ZipOutputStream与ZipEntry
  • ZipOutputStream:相当于一个压缩包;
  • ZipEntry:相当于压缩包里的一个文件;

  以上两个类是SharpZipLib的主类,最耐玩的就是这两个类。

  ZipOutputStream常用属性:

属性说明
IsFinishedZipOutputStream是否已结束

  ZipOutputStream常用方法:

方法说明
CloseEntry关闭入口,关闭之后不允许再对ZipOutputStream进行操作
Finish结束写入
GetLevel读取压缩等级
PutNextEntry往ZipOutputStream里写入一个ZipEntry
SetComment压缩包的注释
SetLevel设置压缩等级,等级越高文件越小
Write写入文件内容

  使用ZipOutputStream创建一个压缩包并往里面写入一个文件的示例:

复制代码
        static void Main(string[] args)
        {
            using (ZipOutputStream s = new ZipOutputStream(File.Create(@"D:123.zip")))
            {
                s.SetLevel(6);  //设置压缩等级,等级越高压缩效果越明显,但占用CPU也会更多using (FileStream fs = File.OpenRead(@"D:1.txt"))
                {
                    byte[] buffer = new byte[4 * 1024];  //缓冲区,每次操作大小
                    ZipEntry entry = new ZipEntry(Path.GetFileName(@"改名.txt"));     //创建压缩包内的文件
                    entry.DateTime = DateTime.Now;  //文件创建时间
                    s.PutNextEntry(entry);          //将文件写入压缩包
                    
                    int sourceBytes;
                    do
                    {
                        sourceBytes = fs.Read(buffer, 0, buffer.Length);    //读取文件内容(1次读4M,写4M)
                        s.Write(buffer, 0, sourceBytes);                    //将文件内容写入压缩相应的文件
                    } while (sourceBytes > 0);
                }
                s.CloseEntry();
            }
            
            Console.ReadKey();
        }
复制代码

  以上示例仅仅能够压缩文件,要压缩文件夹就要使用递归的方式,循环子目录并压缩子目录里的文件。

  示例2:文件夹压缩,保持原文件夹架构:

复制代码
    class Program
    {
        static void Main(string[] args)
        {
            string Source = @"D:	est";
            string TartgetFile = @"D:	est.zip";
            Directory.CreateDirectory(Path.GetDirectoryName(TartgetFile));
            using (ZipOutputStream s = new ZipOutputStream(File.Create(TartgetFile)))
            {
                s.SetLevel(6);
                Compress(Source, s);
                s.Finish();
                s.Close();
            }
            
            Console.ReadKey();
        }

        /// <summary>
        /// 压缩
        /// </summary>
        /// <param name="source">源目录</param>
        /// <param name="s">ZipOutputStream对象</param>
        public static void Compress(string source, ZipOutputStream s)
        {
            string[] filenames = Directory.GetFileSystemEntries(source);
            foreach (string file in filenames)
            {
                if (Directory.Exists(file))
                {
                    Compress(file, s);  //递归压缩子文件夹
                }
                else
                {
                    using (FileStream fs = File.OpenRead(file))
                    {
                        byte[] buffer = new byte[4 * 1024];
                        ZipEntry entry = new ZipEntry(file.Replace(Path.GetPathRoot(file),""));     //此处去掉盘符,如D:1231.txt 去掉D:
                        entry.DateTime = DateTime.Now;
                        s.PutNextEntry(entry);
                        
                        int sourceBytes;
                        do
                        {
                            sourceBytes = fs.Read(buffer, 0, buffer.Length);
                            s.Write(buffer, 0, sourceBytes);
                        } while (sourceBytes > 0);
                    }
                }
            }
        }
    }
复制代码

   附上解压缩方法:

复制代码
        /// <summary>
        /// 解压缩
        /// </summary>
        /// <param name="sourceFile">源文件</param>
        /// <param name="targetPath">目标路经</param>
        public bool Decompress(string sourceFile, string targetPath)
        {
            if (!File.Exists(sourceFile))
            {
                throw new FileNotFoundException(string.Format("未能找到文件 '{0}' ", sourceFile));
            }
            if (!Directory.Exists(targetPath))
            {
                Directory.CreateDirectory(targetPath); 
            }
            using (ZipInputStream s = new ZipInputStream(File.OpenRead(sourceFile)))
            {
                ZipEntry theEntry;
                while ((theEntry = s.GetNextEntry()) != null)
                {
                    string directorName = Path.Combine(targetPath, Path.GetDirectoryName(theEntry.Name));
                    string fileName = Path.Combine(directorName, Path.GetFileName(theEntry.Name));
                    // 创建目录
                    if (directorName.Length > 0)
                    {
                        Directory.CreateDirectory(directorName);
                    }
                    if (fileName != string.Empty)
                    {
                        using (FileStream streamWriter = File.Create(fileName))
                        {
                            int size = 4096;
                            byte[] data = new byte[ 4 * 1024];
                            while (true)
                            {
                                size = s.Read(data, 0, data.Length);
                                if (size > 0)
                                {
                                    streamWriter.Write(data, 0, size);
                                }
                                else break;
                            }
                        }
                    }
                }
            }
            return true;
        }
复制代码

   ZipEntry就没什么好说的了,都是一些属性,指示一下,实际用到的很少。

  框架地址:http://www.icsharpcode.net/OpenSource/SharpZipLib/Download.aspx

免责声明:文章转载自《C# 文件/文件夹压缩》仅用于学习参考。如对内容有疑问,请及时联系本站处理。

上篇DHCP工作原理(地址请求过程)firewall防火墙下篇

宿迁高防,2C2G15M,22元/月;香港BGP,2C5G5M,25元/月 雨云优惠码:MjYwNzM=

相关文章

(6)centos安装和解压

一、rpm包安装方式步骤:1、找到相应的软件包,比如soft.version.rpm,下载到本机某个目录;2、打开一个终端,su -成root用户;3、cd soft.version.rpm所在的目录;4、输入rpm -ivh soft.version.rpm二、deb包安装方式步骤:1、找到相应的软件包,比如soft.version.deb,下载到本机某...

ANT之build文件讲解

ANT build.xml文件详解(一) Ant的概念  可能有些读者并不连接什么是Ant以及入可使用它,但只要使用通过Linux系统得读者,应该知道 make这个命令。当编译Linux内核及一些软件的源程序时,经常要用这个命令。Make命令其实就 是一个项目管理工具,而Ant所实现功能与此类似。像make,gnumake和nmake这些编译工具都有 一定...

Go Modules

官方文档:https://github.com/golang/go/wiki/Modules      https://go.dev/blog/using-go-modules   什么是Go Modules?     go module 是go官方自带的go项目依赖管理工具(类似于Java中的maven)。Go通过Go Modules的依赖管理统一了Go...

解决maven项目无法读取src/main/java目录下面的配置文件问题

我们在用Mybatis去操作底层数据库的时候,需要用到xml配置文件,一般我们是把配置文件和dao放置在同一层目录。 但是在用idea操作maven项目的时候,我们可能会遇到无法读取到dao对应的mapper.xml文件。 简单的解决方法如下: 第一种: 将xml文件移至src/main/resource下面,这样做最省事,但是面临一个问题,就是看起来项目...

【Java学习】jar打包

主线:编译 - 打包 - 运行 准备工作: 1. 手动打可直接执行的jar包 1) 先使用javac编译java文件,得到class文件 2) 新建文件,名字任起,比如可以叫manifest,内容如下(注意:1. 冒号后面加一个空格,2. 最后必须回车到新的空行,否则出错,如下面内容就必须在addJarPkg后面再输入一个回车) Manifest-Vers...

Subversion命令汇总

全局选项: --username ARG   指定用户名称 ARG --password ARG   指定密码 ARG --no-auth-cache   不要缓存用户认证令牌 --non-interactive   不要交互提示 --trust-server-cert   不提示的接受未知的证书颁发机构发行的 SSL 服务器证书(只用于选项“--...