zoukankan      html  css  js  c++  java
  • C#打包文件夹成zip格式(包括文件夹和子文件夹下的所有文件)

    之前不喜欢玩博客,这次在博客园也注册了这个博客玩玩。
    可是没什么内容,所以想随便添加点什么吧。


    最近在微软开发的几个小工具,大多跟文件操作/IO相关,所以准备这两天整理一下,把一些也许可以和大家分享的东西贴出来,希望对于一些C#的初学者有一些帮助吧!
    (更多示例代码,可以访问微软学习者帮助网站 Code smaples from microsoft: http://1code.codeplex.com ,下载微软的All-in-onecode framework  ,这是我最近在Microsoft要接手负责开发的一个供开发者学习的工具,里面可以搜索到有很多示例代码可供学习者参考。)

    C#打包zip文件可以调用现成的第三方dll,事半功倍,而且该dll完全免费,下载地址:SharpZipLib

    下载完解压缩后,把 ICSharpCode.SharpZipLib.dll 拷贝到当前项目的目录下(如果偷懒的话,可以直接拷贝到当前项目的bin\Debug目录下),在VS打开的项目引用上右键添加引用 ICSharpCode.SharpZipLib.dll

    然后,在VS打开的项目上右键新建一个类,命名为 ZipHelper.cs,把类里面的所有code清空,复制以下代码,粘贴:

    using System;
    using System.Collections.Generic;
    using System.Linq;
    using System.Text;
    using System.IO;
    using System.Diagnostics;
    using ICSharpCode.SharpZipLib;
    using ICSharpCode.SharpZipLib.Zip;
    using ICSharpCode.SharpZipLib.Checksums;
    using ICSharpCode.SharpZipLib.Core;
    
    namespace ZipOneCode.ZipProvider
    {
        public class ZipHelper
        {
            /// <summary>
            /// 压缩文件
            /// </summary>
            /// <param name="sourceFilePath"></param>
            /// <param name="destinationZipFilePath"></param>
            public static void CreateZip(string sourceFilePath, string destinationZipFilePath)
            {
                if (sourceFilePath[sourceFilePath.Length - 1] != System.IO.Path.DirectorySeparatorChar)
                    sourceFilePath += System.IO.Path.DirectorySeparatorChar;
    
                ZipOutputStream zipStream = new ZipOutputStream(File.Create(destinationZipFilePath));
                zipStream.SetLevel(6);  // 压缩级别 0-9
                CreateZipFiles(sourceFilePath, zipStream, sourceFilePath);
    
                zipStream.Finish();
                zipStream.Close();
            }
    
            /// <summary>
            /// 递归压缩文件
            /// </summary>
            /// <param name="sourceFilePath">待压缩的文件或文件夹路径</param>
            /// <param name="zipStream">打包结果的zip文件路径(类似 D:\WorkSpace\a.zip),全路径包括文件名和.zip扩展名</param>
            /// <param name="staticFile"></param>
            private static void CreateZipFiles(string sourceFilePath, ZipOutputStream zipStream, string staticFile)
            {
                Crc32 crc = new Crc32();
                string[] filesArray = Directory.GetFileSystemEntries(sourceFilePath);
                foreach (string file in filesArray)
                {
                    if (Directory.Exists(file))                     //如果当前是文件夹,递归
                    {
                        CreateZipFiles(file, zipStream, staticFile);
                    }
    
                    else                                            //如果是文件,开始压缩
                    {
                        FileStream fileStream = File.OpenRead(file);
    
                        byte[] buffer = new byte[fileStream.Length];
                        fileStream.Read(buffer, 0, buffer.Length);
                        string tempFile = file.Substring(staticFile.LastIndexOf("\\") + 1);
                        ZipEntry entry = new ZipEntry(tempFile);
    
                        entry.DateTime = DateTime.Now;
                        entry.Size = fileStream.Length;
                        fileStream.Close();
                        crc.Reset();
                        crc.Update(buffer);
                        entry.Crc = crc.Value;
                        zipStream.PutNextEntry(entry);
    
                        zipStream.Write(buffer, 0, buffer.Length);
                    }
                }
            }
        }
    }
    

    使用方法,在外部引用using ZipOneCode.ZipProvider 后,类似调用 ZipHelper.CreateZip(@"D:\Temp\forzip", @"D:\Temp2\forzip.zip") 即可。

    注意在调用之前,考虑注意一些异常情况的判断,比如源文件路径是否存在等。

  • 相关阅读:
    【465】词干提取与词形还原
    【464】文本转字符向量bag of words
    【462】淘宝个人简介
    Docker 图形化页面管理工具使用
    Docker 简介与shell操作使用
    Spring Boot 入门案例与配置说明
    项目管理工具Maven的安装与使用
    Git(五)IDEA应用Git
    Git(四)Git的分支管理
    Git(三)Git的远程仓库
  • 原文地址:https://www.cnblogs.com/leco/p/1881301.html
Copyright © 2011-2022 走看看