.NET中的zip的压缩和解压
程序员文章站
2022-05-12 17:37:45
...
在.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,将整个文件夹压缩成压缩
代码/// <摘要>
///添加一个文件夹及其子文件夹一个包沿着
/// </摘要>
/// <param名=“文件夹名”>添加文件夹</ param>
/// <param name =“compressedFileName”>创建包</ param>
/// <param name =“overrideExisting”>覆盖exsisitng文件</ param>
/// <返回> </回报>
静态布尔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文件作为容器店
/// </摘要>
/// <param name =“文件名”>文件压缩</ param>
/// <param name =“compressedFileName”>归档文件</ param>
/// <param name =“overrideExisting”>覆盖现有文件</ param>
/// <返回> </回报>
静态布尔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)规范
/// </摘要>
/// <param name =“文件夹名称”>文件夹解压包</ param>
/// <param name = “compressedFileName”>包文件</ param>
/// <param name =“overrideExisting”>覆盖现有文件</ param>
/// <返回> </回报>
静态布尔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);
}
}
一,使用System.IO.Packaging程序压缩和解压
包为一个抽象类,可用于将对象组织到定义的物理格式的单个实体中,从而实现可移植性与高效访问.ZIP文件是包的主物理格式。其他套餐实现可以使用其他物理格式(如XML文档,数据库或Web服务。与文件系统类似,在分层组织的文件夹和文件中引用包中包含的项。虽然包装是抽象类,但Package.Open方法默认使用ZipPackage派生类。
System.IO.Packaging程序在WindowsBase.dll中程序集下,使用时需要添加对WindowsBase的引用。
1,将整个文件夹压缩成压缩
代码/// <摘要>
///添加一个文件夹及其子文件夹一个包沿着
/// </摘要>
/// <param名=“文件夹名”>添加文件夹</ param>
/// <param name =“compressedFileName”>创建包</ param>
/// <param name =“overrideExisting”>覆盖exsisitng文件</ param>
/// <返回> </回报>
静态布尔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文件作为容器店
/// </摘要>
/// <param name =“文件名”>文件压缩</ param>
/// <param name =“compressedFileName”>归档文件</ param>
/// <param name =“overrideExisting”>覆盖现有文件</ param>
/// <返回> </回报>
静态布尔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)规范
/// </摘要>
/// <param name =“文件夹名称”>文件夹解压包</ param>
/// <param name = “compressedFileName”>包文件</ param>
/// <param name =“overrideExisting”>覆盖现有文件</ param>
/// <返回> </回报>
静态布尔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);
}
}