91超碰碰碰碰久久久久久综合_超碰av人澡人澡人澡人澡人掠_国产黄大片在线观看画质优化_txt小说免费全本

溫馨提示×

溫馨提示×

您好,登錄后才能下訂單哦!

密碼登錄×
登錄注冊×
其他方式登錄
點擊 登錄注冊 即表示同意《億速云用戶服務條款》

C#如何實現多文件打包壓縮

發布時間:2021-12-27 16:54:53 來源:億速云 閱讀:474 作者:柒染 欄目:開發技術

C#如何實現多文件打包壓縮,很多新手對此不是很清楚,為了幫助大家解決這個難題,下面小編將為大家詳細講解,有這方面需求的人可以來學習下,希望你能有所收獲。

最近項目需要實現多文件打包的功能,嘗試了一些方法,最后發現使用ICSharpCode.SharpZipLib 最符合項目的要求。

具體實現如下:

1.在 Nuget 中安裝ICSharpCode.SharpZipLib

C#如何實現多文件打包壓縮

2.將要打包的文件放到同個文件夾進行壓縮:

①壓縮文件夾

/// <summary>
        /// 壓縮文件
        /// </summary>
        /// <param name="fileName">壓縮后獲得的文件名</param>
        public static bool CompressFile(string dir, 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(dir, zipStream);
                fileName = dest;
                zipStream.Finish();
                zipStream.Close();
            }
            return true;
        }
        /// <summary>
        /// 壓縮內容到 zipStream 流中
        /// </summary>
        /// <param name="source">源文件</param>
        /// <param name="zipStream">目標文件流(全路徑+文件名+.zip)</param>

        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);
                    }
                }
            }
        }

②將指定文件打包壓縮 (可打包線上文件)

/// <summary>
        /// 打包線上線下文件
        /// </summary>
        /// <param name="fileList">文件列表</param>
        /// <param name="savepath">保存路徑</param>
        public static void ZipOnlineFile3(List<string> fileList, string savepath)
        {
            //判斷保存的文件目錄是否存在
            if (!File.Exists(savepath))
            {
                var file = new FileInfo(savepath);
                if (!file.Directory.Exists)
                {
                    file.Directory.Create();
                }
            }

            Crc32 crc = new Crc32();
            using (ZipOutputStream zipStream = new ZipOutputStream(File.Create(savepath)))
            {
                zipStream.SetLevel(9);   //壓縮級別0-9  

                foreach (var url in fileList)
                {
                    byte[] buffer = new WebClient().DownloadData(url);
                    string tempFileName = GetFileNameByUrl(url);  //獲得當前文件路徑的文件名
                    ZipEntry entry = new ZipEntry(tempFileName);
                    entry.DateTime = DateTime.Now;
                    entry.Size = buffer.Length;
                    crc.Reset();
                    crc.Update(buffer);
                    zipStream.PutNextEntry(entry);
                    zipStream.Write(buffer, 0, buffer.Length);
                }
            }
        }

從文件路徑讀取文件名的方法:

public static string GetFileNameByUrl(string url)
        {
            //判斷路徑是否為空
            if (string.IsNullOrWhiteSpace(url)) return null;

            //判斷是否為線上文件
            if (url.ToLower().StartsWith("http"))
            {
                return url.Substring(url.LastIndexOf("/") + 1);
            }
            else
            {
                return url.Substring(url.LastIndexOf("\\") + 1);
            }
        }

通過此方法生成的壓縮包,所有文件都會顯示在同一層。

③如果需要在文件中創建目錄,需要在文件名稱上指定文件路徑

添加工具類:

/// <summary>
    /// 文件對象
    /// </summary>
    public class FileItem
    {
        /// <summary>
        /// 文件名稱
        /// </summary>
        public string FileName { get; set; }
        /// <summary>
        /// 文件路徑
        /// </summary>
        public string FileUrl { get; set; }
    }

壓縮文件的方法:

/// <summary>
        /// 打包線上線下文件
        /// </summary>
        /// <param name="zipName">壓縮文件名稱</param>
        /// <param name="fileList">文件列表</param>
        /// <param name="savepath">保存路徑</param>
        public static string ZipFiles(string zipName, List<FileItem> fileList, out string error)
        {
            error = string.Empty;

            string path = string.Format("/files/zipFiles/{0}/{1}/{2}/", DateTime.Now.Year, DateTime.Now.Month, DateTime.Now.Day);
            //文件保存目錄
            string directory = FileSavePath + path;
            string url = FileHostUrl.TrimEnd('/') + path + zipName;
            string savePath = directory + zipName;

            try
            {
                if (!Directory.Exists(directory))
                {
                    Directory.CreateDirectory(directory);
                }

                using (ZipOutputStream zipStream = new ZipOutputStream(File.Create(savePath)))
                {
                    zipStream.SetLevel(9);   //壓縮級別0-9

                    foreach (var item in fileList)
                    {
                        byte[] buffer = new WebClient().DownloadData(item.FileUrl);
                        ZipEntry entry = new ZipEntry(item.FileName);
                        entry.DateTime = DateTime.Now;
                        entry.Size = buffer.Length;
                        zipStream.PutNextEntry(entry);
                        zipStream.Write(buffer, 0, buffer.Length);
                    }
                }
            }
            catch (Exception ex)
            {
                error = "文件打包失敗:" + ex.Message;
            }

            return url;
        }

調用參數示例:

{
  "zipName": "test.zip",
  "fileList": [
    {
      "fileName": "123.png",
      "fileUrl": "https://file.yidongcha.cn/files/uploadfiles/image/2021/11/15/11c6de395fcc484faf4745ade62cf6e6.png"
    },
    {
      "fileName": "123/456/789.jpg",
      "fileUrl": "https://file.yidongcha.cn/files/uploadfiles/image/2021/11/15/fe922b250acf4344b8ca4d2aad6e0355.jpg"
    }
  ]
}

生成的結果:

C#如何實現多文件打包壓縮

看完上述內容是否對您有幫助呢?如果還想對相關知識有進一步的了解或閱讀更多相關文章,請關注億速云行業資訊頻道,感謝您對億速云的支持。

向AI問一下細節

免責聲明:本站發布的內容(圖片、視頻和文字)以原創、轉載和分享為主,文章觀點不代表本網站立場,如果涉及侵權請聯系站長郵箱:is@yisu.com進行舉報,并提供相關證據,一經查實,將立刻刪除涉嫌侵權內容。

AI

泰顺县| 牡丹江市| 大同县| 渭源县| 那曲县| 丁青县| 舞阳县| 新昌县| 高陵县| 清丰县| 西丰县| 萨嘎县| 葫芦岛市| 白河县| 黄骅市| 资阳市| 阿城市| 措美县| 谢通门县| 棋牌| 大宁县| 新乡县| 开封县| 建水县| 红河县| 武威市| 峨眉山市| 德钦县| 潼南县| 筠连县| 甘肃省| 城步| 略阳县| 米泉市| 南澳县| 社旗县| 凌源市| 永宁县| 德化县| 和政县| 瓦房店市|