首頁 >後端開發 >C#.Net教程 >.NET中的zip的壓縮和解壓

.NET中的zip的壓縮和解壓

巴扎黑
巴扎黑原創
2016-12-19 16:35:232195瀏覽

在.NET可以透過多種方式實現的zip的壓縮和解壓:1,使用System.IO.Packaging程式; 2,使用第三方類別庫; 3,透過System.IO.Compression命名空間中新增的ZipArchive ,的ZipFile類等實現 

     一,使用System.IO.Packaging程序壓縮和解壓 

     包為一個抽象類,可用於將對象組織到定義的物理格式的單個實體中,從而實現高效性與存取.ZIP檔案是包的主物理格式。其他套餐實作可以使用其他物理格式(如XML文檔,資料庫或Web服務。與文件系統類似,在分層組織的資料夾和文件中引用包中包含的項目。雖然包裝是抽象類,但Package.Open方法預設使用ZipPackage衍生類別。  
        ///新增一個資料夾及其子資料夾一個包沿著 
        /// 摘要> 
    /// 建立套件 param> 
        /// 覆蓋exsisitng檔案 param>   PackageFolder(字串資料夾名,字串compressedFileName,布林overrideExisting) 
        { 
              FOLDERNAME = folderName.Remove(folderName.Length - 1); 
            布林結果= FALSE; 
如果(Directory.Exists(文件夾名)!) 
            { 
                返回結果; 
            } 

            (!overrideExisting && File.Exists(compressedFileName))如果 
            { 
                返回結果; 
            } 
            嘗試 
            { 
                使用(套餐包= Package.Open(compressedFileName,FileMode.Create)) 
                { 
    “*”,SearchOption.AllDirectories); 
                    的foreach(在的fileList字串檔案名稱) 

                       
                        //包中的路徑是所有文件夾名後的子文件夾 
                        弦pathInPackage; 
                        pathInPackage = Path.GetDirectoryName(文件名).Replace(文件夾名,的String.Empty)+“/”+ Path.GetFileName(檔案名稱); 

                        烏里partUriDocument = PackUriHelper.CreatePartUri(新的URI(pathInPackage,UriKind.Relative)); 
                        的PackagePart packagePartDocument = package.CreatePart(partUriDocument,“”,CompressionOption.Maximum); 
                        使用(的FileStream FILESTREAM =新的FileStream (檔案名稱,FileMode.Open,FileAccess.Read)) 
                             fileStream.CopyTo(packagePartDocument.GetStream()); 
                  }   } 
                } 
                      上(例外) 
            { 
拋出新的例外(「錯誤荏蓒文件夾」資料夾名稱+,E); 
            } 
            } 
      2,且將單一檔案加入壓縮檔案中 

的程式碼///
        ///壓縮檔案成ZIP檔案作為容器店 
        /// 摘要> 
      =“compressedFileName” >歸檔檔案 param> 
        /// 覆寫現有檔案 param> 
       compressedFileName,布林overrideExisting) 
        { 
            布林結果= FALSE;  ) 
            { 
                返回結果; 
            } 

            (!overrideExisting && File.Exists(compressedFileName))如果 
            { 
                返回結果; 
            } 

            嘗試 
            { 
                烏里partUriDocument = PackUriHelper.CreatePartUri(新的URI(Path .GetFileName(檔案名稱),UriKind.Relative)); 
               
使用(套餐包= Package.Open(compressedFileName,FileMode.OpenOrCreate)) 
                {    Document)) 
                    { 
         
                    } 

          partUriDocument,“”,CompressionOption.Maximum); 
                               { 
                              } 

                     { 
               為新的例外(「錯誤壓縮與解文件」+檔案名,E);  
            回傳結果; 
        } 3,且壓縮文件解壓縮 

代碼///  
        ///提取物的容器郵編。附註:容器必須建立為開放式打包約定(OPC)規格 
        /// 摘要> 
        /// 包裝檔案 param> 
        /// 覆現有檔案 param> 
   檔案夾名,字串compressedFileName,布林overrideExisting) 
        { 
                   { 
                若的(File.Exists(compressedFileName)!)                回傳結果; 
                } 
   DirectoryInfo的(資料夾名稱); 
               與(!directoryInfo.Exists) 
directoryInfo.Create(); 

                使用(套餐包= Package.Open(compressedFileName,FileMode.Open,FileAccess.Read)) 
                { 
                    的foreach(的PackagePart的PackagePart在package.GetParts()) 
                    { 
                        ExtractPart(的PackagePart,文件夾名,overrideExisting); 
                    }           結果=真; 
            } 
                       拋出新的例外(「錯誤解壓縮檔案」+ compressedFileName,E);
            } 
            
             靜態無效ExtractPart(的PackagePart的PackagePart,在串targetdirectory中,布林overrideExisting) 
        {  p. Part.Uri.ToString())更換('\','/')。

            如果(Directory.Exists(Path.GetDirectoryName(stringPart))!) 
     

            若(!overrideExisting && File.Exists(stringPart)) 
        的FileStream FILESTREAM =新的FileStream(stringPart,FileMode.Create)) 
            { 
       
       Sharp 

代碼 
 
     
 “DLL”的ContentType =“應用程式/八位元組-stream“/> 
     
     
     
類型>同樣,如果壓縮檔案不包含[內容]的.xml文件,或者[內容]的.xml檔案不包含所對應副檔名的描述(手動新增的[內容]的.xml也是可以) ,將無法解壓縮檔案。二,使用第三方類別庫壓縮的壓縮和解壓使用比較的有SharpZipLib和DotNetZip。 

      1,SharpZipLib,也稱為“#ziplib”,基於GPL開源,支援ZIP,GZIP在內焦油和BZip2壓縮的壓縮和解壓縮。 

      支援.NET 1.1,.NET 2.0(3.5,4.0)。

      (1)ZIP壓縮 

Codepublic靜態無效的郵編(字串SRCFILE,串聯DstFile,INT緩衝區大小) 

 
    的FileStream fileStreamOut =新的FileStream 
(DstFile,FileMode.Create,FileAccess.Write); 
    ZipOutputStream zipOutStream =新ZipOutumStream(StreamOut);入門的ZipEntry =新的ZipEntry(Path.GetFileName(SRCFILE)); 
    zipOutStream.PutNextEntry(輸入); 
    INT  🠎 fileStreamIn.Read(緩衝,0,buffer.Length); 
        zipOutStream .Write(緩衝液,0,大小); 
    }而(大小> 0); 
    zipOutStream.Close(); 
    fileStreamOut.Close();的解壓縮(字串SRCFILE,串聯DstFile,INT緩衝區大小) 

    的FileStream fileStreamIn =新的FileStream 
(SRCFILE,FileMode.Open,FileAccess.Read);In 
(SRCFILE,File  ZipEntry的條目= zipInStream.GetNextEntry(); 
    的FileStream fileStreamOut =新的FileStream 
(DstFile + @“”+ entry.Name,FileMode.Create,FileAccess.Write); INT 新位元組; 
    做 
    { 
        大小= zipInStream.Read(緩衝,0,buffer.Length)    }而(大小> 0 ); 
    zipInStream.Close(); 
    fileStreamOut.Close(); 
    fileStreamIn.Close(); 
} 2,DotNetLib,是基於「使用比PL」使用元件來比較系統(系統使用比對” ZipFile =新的ZipFile()) 
  { 
    zip.AddFile(的「readme.txt」); 
    zip.AddFile(「7440-N09th.     
zip.Save(「Archive.zip」); 
  }(2)解壓縮Codeprivate無效MyExtract() 
  { 
            使用(ZIP1使用ZipFile = ZipFile.Read(zipToUnpack)) 
      { 
          //這裡,且我們擷取的每個項目,但任何條件          的foreach }(ZipEntry的E在ZIP1) 
          { 
             
       } 
    } 



    三,且.NET 4.5使用ZipArchive,的ZipFile等類別壓縮和解靜態無效的主要(字符串[] args) 
        { 
              ampleuser 萃取物”; 
字串NEWFILE = @「C:使用者exampleuser NewFile.txt」 

            使用(ZipArchive存檔= ZipFile.Open(ZipPath                Archive.CreateEntryFromFile(NEWFILE「NewEntry.txt」); 
        txt」); 
        ExtractToDirectory(ExtractPath); 
            } 
        }

陳述:
本文內容由網友自願投稿,版權歸原作者所有。本站不承擔相應的法律責任。如發現涉嫌抄襲或侵權的內容,請聯絡admin@php.cn