如何壓縮資料夾(.zip)

使用者透過網路要如何取得存放在IIS上某個資料夾中的資料呢?

資料很多時,是否應該要一起下載下來而不是一次一個?

一個資料夾要怎麼下載下來呢?

壓縮檔案便是一個解

靜態的Folder如何壓縮成一個zip檔案

我是參考此篇的做法(在此紀錄方法)

  1.  引入ICSharpCode.SharpZipLib ,可以從nuget下載安裝、或者透過網址下載安裝
      https://www.dllme.com/getfile.php?file=11336&id=c8164876b6f66616d68387443621510c
  2. 引入參考後
    using ICSharpCode.SharpZipLib.Zip;
    using ICSharpCode.SharpZipLib.Checksums;

    撰寫程式(這邊的程式碼我直接引用了參考1的網址,唯獨 //打开压缩文件using (FileStream fs = File.OpenRead(file))
    這邊因為File的windows form的方法所以將此改寫 using (FileStream fs = new FileStream(file, FileMode.Open, FileAccess.Read)){}

  3. 只要根據他的param去填寫即可
            //test
            string DirectoryToZip = "C:/Users/Emily/source/repos/JeanServiceWeb/JeanServiceWeb/Files/1459_test@gmail_com";
            string ZipedPath = "C:/Users/Emily/source/repos/JeanServiceWeb/JeanServiceWeb/Files";      
            //產生壓縮檔
            ZipDirectory(DirectoryToZip, ZipedPath);
    
    
    
            /// <summary>
            /// ZIP:压缩文件夹
            /// add yuangang by 2016-06-13
            /// </summary>
            /// <param name="DirectoryToZip">需要压缩的文件夹(绝对路径)</param>
            /// <param name="ZipedPath">压缩后的文件路径(绝对路径)</param>
            /// <param name="ZipedFileName">压缩后的文件名称(文件名,默认 同源文件夹同名)</param>
            /// <param name="IsEncrypt">是否加密(默认 加密)</param>
            public  void ZipDirectory(string DirectoryToZip, string ZipedPath, string ZipedFileName = "", bool IsEncrypt = false)
            {
                //如果目录不存在,则报错
                if (!System.IO.Directory.Exists(DirectoryToZip))
                {
                    throw new System.IO.FileNotFoundException("指定的目录: " + DirectoryToZip + " 不存在!");
                }
    
                //文件名称(默认同源文件名称相同)
                string ZipFileName =
                     string.IsNullOrEmpty(ZipedFileName) ? ZipedPath + "\\" + new DirectoryInfo(DirectoryToZip).Name + ".zip" : ZipedPath + "\\" + ZipedFileName + ".zip";
    
                using (System.IO.FileStream ZipFile = System.IO.File.Create(ZipFileName))
                {
                    using (ZipOutputStream s = new ZipOutputStream(ZipFile))
                    {
                        if (IsEncrypt)
                        {
                            //压缩文件加密
                            s.Password = "123";
                        }
                        ZipSetp(DirectoryToZip, s, "");
                    }
                }
            }
    
            /// <summary>
            /// 递归遍历目录
            /// add yuangang by 2016-06-13
            /// </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 (FileStream fs = File.OpenRead(file))
                        using (FileStream fs = new FileStream(file,
                            FileMode.Open, FileAccess.Read))
                        {
    
                            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);
                        }
                    }
                }
            }

     

 產生壓縮檔後希望可以將原先的檔案夾刪除
   string ZipedPath = "C:/Users/Emily/source/repos/JeanServiceWeb/JeanServiceWeb/Files";      
   //刪除原資料夾
   System.IO.Directory.Delete(DirectoryToZip, true);

 


參考資料:

  1. https://blog.csdn.net/AAA123524457/article/details/89309454
  2. https://www.dllme.com/getfile.php?file=11336&id=c8164876b6f66616d68387443621510c