SharpCompress壓縮和解壓縮,並解決壓縮的中文亂碼問題


一.下載SharpCompress庫

 

二.解壓縮

(1)不帶密碼

        /// <summary>
        /// 解壓縮(支持rar,zip)
        /// </summary>
        /// <param name="fromFilePath">待解壓文件全路徑</param>
        /// <param name="outFileDirectory">解壓文件后目錄</param>
        public static void Decompress(string fromFilePath, string outFileDirectory)
        {
            var archive = ArchiveFactory.Open(fromFilePath);
            foreach (var entry in archive.Entries)
            {
                if (!entry.IsDirectory)
                {
                    //Debug.WriteLine(entry.Key);
                    entry.WriteToDirectory(outFileDirectory, new ExtractionOptions { ExtractFullPath = true, Overwrite = true });
                }
            }
        }

(2)帶密碼

        /// <summary>
        /// 解壓縮加密的包(支持rar,zip)
        /// </summary>
        /// <param name="fromFilePath">待解壓文件全路徑</param>
        /// <param name="outFileDirectory">解壓文件后目錄</param>
        /// <param name="password">密碼</param>
        public static void DecompressWithPwd(string fromFilePath, string outFileDirectory, string password)
        {
            using (var archive = ArchiveFactory.Open(fromFilePath, new ReaderOptions { Password = password }))
            {
                foreach (var entry in archive.Entries)
                {
                    if (!entry.IsDirectory)
                    {
                        //Debug.WriteLine(entry.Key);
                        entry.WriteToDirectory(outFileDirectory, new ExtractionOptions { ExtractFullPath = true, Overwrite = true });
                    }
                }
            }
        }

三.壓縮

 /// <summary>
        /// 壓縮(zip格式)
        /// </summary>
        /// <param name="fromFileDirectory">待壓縮目錄</param>
        /// <param name="outFilePath">壓縮后文全件路徑</param>
        public static void ZipCompress(string fromFileDirectory, string outFilePath)
        {
            //解決中文亂碼問題
            SharpCompress.Common.ArchiveEncoding ArchiveEncoding = new SharpCompress.Common.ArchiveEncoding();
            ArchiveEncoding.Default = Encoding.GetEncoding("utf-8");
            SharpCompress.Writers.WriterOptions options = new SharpCompress.Writers.WriterOptions(CompressionType.Deflate);
            options.ArchiveEncoding = ArchiveEncoding;

            using (var archive = ZipArchive.Create())
            {
                archive.AddAllFromDirectory(fromFileDirectory);
                using (var zip = File.OpenWrite(outFilePath))
                    archive.SaveTo(zip, options);
            }
        }

  

四.調用

//壓縮
string fromFileDirectory = @"C:\test\我是目錄";
string outFilePath = @"C:\壓縮包1.zip";
CompressHelper.ZipCompress(fromFileDirectory, outFilePath);

//解壓縮
string fromFilePath = @"C:\壓縮包1.zip";
string outFileDirectory = @"C:\解壓目錄\壓縮包1";
CompressHelper.Decompress(fromFilePath, outFileDirectory);

  

五.中文亂碼問題

老版本直接加入下面一行代碼就可以了

SharpCompress.Common.ArchiveEncoding.Default = Encoding.GetEncoding ("utf-8");

但是我使用的是0.23.0版本,.ArchiveEncoding已經從靜態類改為普通類了,無法這樣調用

參考:https://github.com/adamhathcock/sharpcompress/issues/268

 

 最后發現:ArchiveEncoding類是OptionsBase的屬性,而OptionsBase是WriterOptions的基類,ZipArchive的SaveTo方法帶WriterOptions參數,那就ok了

 

參考:

wiki:https://github.com/adamhathcock/sharpcompress/wiki/API-Examples

支持類型:https://github.com/adamhathcock/sharpcompress/wiki/Supported-Formats


免責聲明!

本站轉載的文章為個人學習借鑒使用,本站對版權不負任何法律責任。如果侵犯了您的隱私權益,請聯系本站郵箱yoyou2525@163.com刪除。



 
粵ICP備18138465號   © 2018-2025 CODEPRJ.COM