Maison  >  Article  >  développement back-end  >  .NET中的zip的压缩和解压

.NET中的zip的压缩和解压

巴扎黑
巴扎黑original
2016-12-19 16:35:232168parcourir

在.NET可以通过多种方式实现的zip的压缩和解压:1,使用System.IO.Packaging程序; 2,使用第三方类库; 3,通过System.IO.Compression命名空间中新增的ZipArchive,的ZipFile类等实现 

     一,使用System.IO.Packaging程序压缩和解压 

     包为一个抽象类,可用于将对象组织到定义的物理格式的单个实体中,从而实现可移植性与高效访问.ZIP文件是包的主物理格式。其他套餐实现可以使用其他物理格式(如XML文档,数据库或Web服务。与文件系统类似,在分层组织的文件夹和文件中引用包中包含的项。虽然包装是抽象类,但Package.Open方法默认使用ZipPackage派生类。 

    System.IO.Packaging程序在WindowsBase.dll中程序集下,使用时需要添加对WindowsBase的引用。 

    1,将整个文件夹压缩成压缩 

代码/// <摘要> 
        ///添加一个文件夹及其子文件夹一个包沿着 
        ///  
        /// 添加文件夹 
        /// 创建包 
        /// 覆盖exsisitng文件 
        /// <返回>  
        静态布尔PackageFolder(字符串文件夹名,字符串compressedFileName,布尔overrideExisting) 
        { 
            如果(folderName.EndsWith(@“\”)) 
                FOLDERNAME = folderName.Remove(folderName.Length - 1); 
            布尔结果= FALSE; 
            如果(Directory.Exists(文件夹名)!) 
            { 
                返回结果; 
            } 

            (!overrideExisting && File.Exists(compressedFileName))如果 
            { 
                返回结果; 
            } 
            尝试 
            { 
                使用(套餐包= Package.Open(compressedFileName,FileMode.Create)) 
                { 
                    VAR的fileList = Directory.EnumerateFiles(文件夹名,“*”,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文件作为容器店 
        ///  
        /// 文件压缩 
        /// 归档文件 
        /// 覆盖现有文件 
        /// <返回>  
        静态布尔PackageFile(字符串文件名,字符串compressedFileName,布尔overrideExisting) 
        { 
            布尔结果= FALSE; 

            如果(File.Exists(文件名)!) 
            { 
                返回结果; 
            } 

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

            尝试 
            { 
                乌里partUriDocument = PackUriHelper.CreatePartUri(新的URI(Path.GetFileName(文件名),UriKind.Relative)); 
               
                使用(套餐包= Package.Open(compressedFileName,FileMode.OpenOrCreate)) 
                { 
                    如果(package.PartExists(partUriDocument)) 
                    { 
                        package.DeletePart(partUriDocument); 
                    } 

                    的PackagePart packagePartDocument = package.CreatePart(partUriDocument,“”,CompressionOption.Maximum); 
                    使用(的FileStream FILESTREAM =新的FileStream(文件名,FileMode.Open,FileAccess.Read)) 
                    { 
                        fileStream.CopyTo(packagePartDocument.GetStream()); 
                    } 
                } 
                结果=真; 
            } 
            赶上(例外五) 
            { 
                抛出新的异常(“错误压缩和解文件”+文件名,E); 
            } 
            
            返回结果; 
        } 3,压缩文件解压 

代码/// <摘要> 
        ///提取物的容器邮编。注:容器必须创建为开放式打包约定(OPC)规范 
        ///  
        /// 文件夹解压包 
        /// 包文件 
        /// 覆盖现有文件 
        /// <返回>  
        静态布尔UncompressFile(字符串文件夹名,字符串compressedFileName,布尔overrideExisting) 
        { 
            布尔结果= FALSE; 
            尝试 
            { 
                如果(File.Exists(compressedFileName)!) 
                { 
                    返回结果; 
                } 

                的DirectoryInfo DirectoryInfo的=新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) 
        { 
            字符串stringPart = targetdirectory中+ HttpUtility.UrlDecode(packagePart.Uri.ToString())更换('\\','/')。 

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

            如果(!overrideExisting && File.Exists(stringPart)) 
                回报; 
            使用(的FileStream FILESTREAM =新的FileStream(stringPart,FileMode.Create)) 
            { 
                packagePart.GetStream()CopyTo从(FILESTREAM)。 
            } 
        } 

      使用包压缩文件会在压缩文件自动生成[内容]的.xml,用来描述压缩文件解压支持的文件格式。 

代码<?XML版本=“1.0”编码=“UTF-8”?> 
<类型的xmlns =“http://schemas.openxmlformats.org/package/2006/content-types”> 
    <默认扩展=“vsixmanifest”的ContentType =“文本/ XML”/> 
    <默认扩展=“DLL”的ContentType =“应用程序/八位字节-stream“/> 
    <默认扩展=”PNG“的ContentType =”应用程序/八位字节流“/> 
    <默认扩展=”TXT“的ContentType =”text / plain的“/> 
    <默认扩展=”pkgdef“的ContentType =”TEXT /平原“/> 
同样,如果压缩文件不包含[内容]的.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 fileStreamIn =新的FileStream 
(SRCFILE,FileMode.Open,FileAccess.Read); 
    的FileStream fileStreamOut =新的FileStream 
(DstFile,FileMode.Create,FileAccess.Write); 
    ZipOutputStream zipOutStream =新ZipOutputStream(fileStreamOut); 
    字节[]缓冲区=新字节<缓冲区大小/>; 
    入门的ZipEntry =新的ZipEntry(Path.GetFileName(SRCFILE)); 
    zipOutStream.PutNextEntry(输入); 
    INT大小; 
    做 
    { 
        大小= fileStreamIn.Read(缓冲,0,buffer.Length); 
        zipOutStream.Write(缓冲液,0,大小); 
    }而(大小> 0); 
    zipOutStream.Close(); 
    fileStreamOut.Close(); 
    fileStreamIn.Close(); 
}(2)解压zipCodepublic静态无效的解压(字符串SRCFILE,串DstFile,INT缓冲区大小) 

    的FileStream fileStreamIn =新的FileStream 
(SRCFILE,FileMode.Open,FileAccess.Read); 
    ZipInputStream zipInStream =新ZipInputStream(fileStreamIn); 
    ZipEntry的条目= zipInStream.GetNextEntry(); 
    的FileStream fileStreamOut =新的FileStream 
(DstFile + @“\”+ entry.Name,FileMode.Create,FileAccess.Write); 
    INT大小; 
    字节[]缓冲区=新字节<缓冲区大小/>; 
    做 
    { 
        大小= zipInStream.Read(缓冲,0,buffer.Length); 
        fileStreamOut.Write(缓冲液,0,大小); 
    }而(大小> 0); 
    zipInStream.Close(); 
    fileStreamOut.Close(); 
    fileStreamIn.Close(); 
} 2,DotNetLib,是基于“WS-PL”开源,使用比较简单(1)压缩代码使用(拉链使用ZipFile =新的ZipFile()) 
  { 
    zip.AddFile(的“readme.txt”); 
    zip.AddFile(“7440-N49th.png”); 
    zip.AddFile(“2008_Annual_Report.pdf”);        
    zip.Save(“Archive.zip”); 
  }(2)解压Codeprivate无效MyExtract() 
  { 
      字符串zipToUnpack =“C1P3SML.zip”; 
      字符串unpackDirectory =“解压缩文件”; 
      使用(ZIP1使用ZipFile = ZipFile.Read(zipToUnpack)) 
      { 
          //这里,我们提取的每个条目,但我们可以有条件地提取 
          根据条目名称,大小,日期,复选框状态等//  
          的foreach(ZipEntry的E在ZIP1) 
          { 
            e.Extract(unpackDirectory,ExtractExistingFileAction.OverwriteSilently); 
          } 
       } 
    } 



    三,在.NET 4.5使用ZipArchive,的ZipFile等类压缩和解压 

代码静态无效的主要(字串[] args) 
        { 
            字符串ZipPath = @“C:\用户\ exampleuser \ start.zip” 
            字符串ExtractPath = @“C:\用户\ exampleuser \提取物”; 
            字符串NEWFILE = @“C:\用户\ exampleuser \ NewFile.txt” 

            使用(ZipArchive存档= ZipFile.Open(ZipPath,ZipArchiveMode.Update)) 
            { 
                Archive.CreateEntryFromFile(NEWFILE“NewEntry.txt”); 
                Archive.ExtractToDirectory(ExtractPath); 
            } 
        }

Déclaration:
Le contenu de cet article est volontairement contribué par les internautes et les droits d'auteur appartiennent à l'auteur original. Ce site n'assume aucune responsabilité légale correspondante. Si vous trouvez un contenu suspecté de plagiat ou de contrefaçon, veuillez contacter admin@php.cn
Article précédent:.net中XML转换成TreeView视图Article suivant:C#文件操作