SharpZipLib压缩指定的目录

/// <summary>
    /// ZIP:压缩文件夹
    /// </summary>
    /// <param name="DirectoryToZip">需要压缩的文件夹(绝对路径)</param>
    /// <param name="ZipedPath">压缩后的文件路径(绝对路径)</param>
    /// <param name="ZipedFileName">压缩后的文件名称(文件名,默认 同源文件夹同名)</param>
    /// <param name="IsEncrypt">是否加密(默认 加密)</param>
    public static void ZipDirectory(string DirectoryToZip, string ZipedPath, string ZipedFileName = "")
    {
        //如果目录不存在,则报错
        if (!Directory.Exists(DirectoryToZip))
        {
            throw new System.IO.FileNotFoundException("指定的目录: " + DirectoryToZip + " 不存在!");
        }

        //文件名称(默认同源文件名称相同)
        string ZipFileName = string.IsNullOrEmpty(ZipedFileName) ? ZipedPath + "\\" + new DirectoryInfo(DirectoryToZip).Name + ".zip" : ZipedPath + "\\" + ZipedFileName + ".zip";

        using (FileStream ZipFile = File.Create(ZipFileName))
        {
            using (ZipOutputStream s = new ZipOutputStream(ZipFile))
            {
                ZipSetp(DirectoryToZip, s, "");
            }
        }
    }

    /// <summary>
    /// 递归遍历目录
    /// </summary>
    private static void ZipSetp(string strDirectory, ZipOutputStream s, string parentPath)
    {
        if (strDirectory[strDirectory.Length - 1] != Path.DirectorySeparatorChar)
        {
            strDirectory += Path.DirectorySeparatorChar;
        }
        Crc32 crc = new Crc32();

        string[] filenames = Directory.GetFileSystemEntries(strDirectory);

        foreach (string file in filenames)// 遍历所有的文件和目录
        {

            if (Directory.Exists(file))// 先当作目录处理如果存在这个目录就递归Copy该目录下面的文件
            {
                string pPath = parentPath;
                pPath += file.Substring(file.LastIndexOf("\\") + 1);
                pPath += "\\";
                ZipSetp(file, s, pPath);
            }

            else // 否则直接压缩文件
            {
                //打开压缩文件
                using (System.IO.FileStream fs = File.OpenRead(file))
                {

                    byte[] buffer = new byte[fs.Length];
                    fs.Read(buffer, 0, buffer.Length);

                    string fileName = parentPath + file.Substring(file.LastIndexOf("\\") + 1);
                    ZipEntry entry = new ZipEntry(fileName);

                    entry.DateTime = DateTime.Now;
                    entry.Size = fs.Length;

                    fs.Close();

                    crc.Reset();
                    crc.Update(buffer);

                    entry.Crc = crc.Value;
                    s.PutNextEntry(entry);

                    s.Write(buffer, 0, buffer.Length);
                }
            }
        }
    }

需要nuget安装ICSharpCode.SharpZipLib

posted @ 2021-12-28 19:25  极客船长  阅读(175)  评论(0编辑  收藏  举报