asp.NET中实现文件的压缩和解压(3种方式)

2025-05-29 0 89

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

一、使用System.IO.Packaging压缩和解压

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

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

1、将整个文件夹压缩成zip

?

1

2

3

4

5

6

7

8

9

10

11

12

13

14

15

16

17

18

19

20

21

22

23

24

25

26

27

28

29

30

31

32

33

34

35

36

37

38

39

40

41

42

43

44

45

46

47

48

49

50
/// <summary>

/// Add a folder along with its subfolders to a Package

/// </summary>

/// <param name="folderName">The folder to add</param>

/// <param name="compressedFileName">The package to create</param>

/// <param name="overrideExisting">Override exsisitng files</param>

/// <returns></returns>

static bool PackageFolder(string folderName, string compressedFileName, bool overrideExisting)

{

if (folderName.EndsWith(@"\\"))

folderName = folderName.Remove(folderName.Length - 1);

bool result = false;

if (!Directory.Exists(folderName))

{

return result;

}

if (!overrideExisting && File.Exists(compressedFileName))

{

return result;

}

try

{

using (Package package = Package.Open(compressedFileName, FileMode.Create))

{

var fileList = Directory.EnumerateFiles(folderName, "*", SearchOption.AllDirectories);

foreach (string fileName in fileList)

{

//The path in the package is all of the subfolders after folderName

string pathInPackage;

pathInPackage = Path.GetDirectoryName(fileName).Replace(folderName, string.Empty) + "/" + Path.GetFileName(fileName);

Uri partUriDocument = PackUriHelper.CreatePartUri(new Uri(pathInPackage, UriKind.Relative));

PackagePart packagePartDocument = package.CreatePart(partUriDocument,"", CompressionOption.Maximum);

using (FileStream fileStream = new FileStream(fileName, FileMode.Open, FileAccess.Read))

{

fileStream.CopyTo(packagePartDocument.GetStream());

}

}

}

result = true;

}

catch (Exception e)

{

throw new Exception("Error zipping folder " + folderName, e);

}

return result;

}

2、将单个文件添加到zip文件中

?

1

2

3

4

5

6

7

8

9

10

11

12

13

14

15

16

17

18

19

20

21

22

23

24

25

26

27

28

29

30

31

32

33

34

35

36

37

38

39

40

41

42

43

44

45

46

47
/// <summary>

/// Compress a file into a ZIP archive as the container store

/// </summary>

/// <param name="fileName">The file to compress</param>

/// <param name="compressedFileName">The archive file</param>

/// <param name="overrideExisting">override existing file</param>

/// <returns></returns>

static bool PackageFile(string fileName, string compressedFileName, bool overrideExisting)

{

bool result = false;

if (!File.Exists(fileName))

{

return result;

}

if (!overrideExisting && File.Exists(compressedFileName))

{

return result;

}

try

{

Uri partUriDocument = PackUriHelper.CreatePartUri(new Uri(Path.GetFileName(fileName), UriKind.Relative));

using (Package package = Package.Open(compressedFileName, FileMode.OpenOrCreate))

{

if (package.PartExists(partUriDocument))

{

package.DeletePart(partUriDocument);

}

PackagePart packagePartDocument = package.CreatePart(partUriDocument, "", CompressionOption.Maximum);

using (FileStream fileStream = new FileStream(fileName, FileMode.Open, FileAccess.Read))

{

fileStream.CopyTo(packagePartDocument.GetStream());

}

}

result = true;

}

catch (Exception e)

{

throw new Exception("Error zipping file " + fileName, e);

}

return result;

}

3、zip文件解压

?

1

2

3

4

5

6

7

8

9

10

11

12

13

14

15

16

17

18

19

20

21

22

23

24

25

26

27

28

29

30

31

32

33

34

35

36

37

38

39

40

41

42

43

44

45

46

47

48

49

50

51

52

53
/// <summary>

/// Extract a container Zip. NOTE: container must be created as Open Packaging Conventions (OPC) specification

/// </summary>

/// <param name="folderName">The folder to extract the package to</param>

/// <param name="compressedFileName">The package file</param>

/// <param name="overrideExisting">override existing files</param>

/// <returns></returns>

static bool UncompressFile(string folderName, string compressedFileName, bool overrideExisting)

{

bool result = false;

try

{

if (!File.Exists(compressedFileName))

{

return result;

}

DirectoryInfo directoryInfo = new DirectoryInfo(folderName);

if (!directoryInfo.Exists)

directoryInfo.Create();

using (Package package = Package.Open(compressedFileName, FileMode.Open, FileAccess.Read))

{

foreach (PackagePart packagePart in package.GetParts())

{

ExtractPart(packagePart, folderName, overrideExisting);

}

}

result = true;

}

catch (Exception e)

{

throw new Exception("Error unzipping file " + compressedFileName, e);

}

return result;

}

static void ExtractPart(PackagePart packagePart, string targetDirectory, bool overrideExisting)

{

string stringPart = targetDirectory + HttpUtility.UrlDecode(packagePart.Uri.ToString()).Replace('\\\\', '/');

if (!Directory.Exists(Path.GetDirectoryName(stringPart)))

Directory.CreateDirectory(Path.GetDirectoryName(stringPart));

if (!overrideExisting && File.Exists(stringPart))

return;

using (FileStream fileStream = new FileStream(stringPart, FileMode.Create))

{

packagePart.GetStream().CopyTo(fileStream);

}

}

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

?

1

2

3

4

5

6

7

8
<?xml version="1.0" encoding="utf-8" ?>

<Types xmlns="http://schemas.openxmlformats.org/package/2006/content-types">

<Default Extension="vsixmanifest" ContentType="text/xml" />

<Default Extension="dll" ContentType="application/octet-stream" />

<Default Extension="png" ContentType="application/octet-stream" />

<Default Extension="txt" ContentType="text/plain" />

<Default Extension="pkgdef" ContentType="text/plain" />

</Types>

同样,如果zip文件不包含[Content_Type].xml文件,或者[Content_Type].xml文件不包含所对应扩展名的描述(手动添加的[Content_Type].xml也是可以),将无法解压文件。

二、使用第三方类库

zip的压缩和解压使用比较的有SharpZipLib和DotNetZip。

1、SharpZipLib,也称为“#ziplib”,基于GPL开源,支持Zip,GZip,Tar和BZip2的压缩和解压缩。

支持.NET 1.1,NET 2.0(3.5、4.0).

(1)zip压缩

?

1

2

3

4

5

6

7

8

9

10

11

12

13

14

15

16

17

18

19

20
public static void Zip(string SrcFile, string DstFile, int BufferSize)

{

FileStream fileStreamIn = new FileStream

(SrcFile, FileMode.Open, FileAccess.Read);

FileStream fileStreamOut = new FileStream

(DstFile, FileMode.Create, FileAccess.Write);

ZipOutputStream zipOutStream = new ZipOutputStream(fileStreamOut);

byte[] buffer = new byte<buffersize />;

ZipEntry entry = new ZipEntry(Path.GetFileName(SrcFile));

zipOutStream.PutNextEntry(entry);

int size;

do

{

size = fileStreamIn.Read(buffer, 0, buffer.Length);

zipOutStream.Write(buffer, 0, size);

} while (size > 0);

zipOutStream.Close();

fileStreamOut.Close();

fileStreamIn.Close();

}

(2)解压zip

?

1

2

3

4

5

6

7

8

9

10

11

12

13

14

15

16

17

18

19
public static void UnZip(string SrcFile, string DstFile, int BufferSize)

{

FileStream fileStreamIn = new FileStream

(SrcFile, FileMode.Open, FileAccess.Read);

ZipInputStream zipInStream = new ZipInputStream(fileStreamIn);

ZipEntry entry = zipInStream.GetNextEntry();

FileStream fileStreamOut = new FileStream

(DstFile + @"\\" + entry.Name, FileMode.Create, FileAccess.Write);

int size;

byte[] buffer = new byte<buffersize />;

do

{

size = zipInStream.Read(buffer, 0, buffer.Length);

fileStreamOut.Write(buffer, 0, size);

} while (size > 0);

zipInStream.Close();

fileStreamOut.Close();

fileStreamIn.Close();

}

2、DotNetLib,是基于”WS-PL”开源,使用比较简单

(1)压缩

?

1

2

3

4

5

6

7
using (ZipFile zip = new ZipFile())

{

zip.AddFile("ReadMe.txt");

zip.AddFile("7440-N49th.png");

zip.AddFile("2008_Annual_Report.pdf");

zip.Save("Archive.zip");

}

(2)解压

?

1

2

3

4

5

6

7

8

9

10

11

12

13

14
private void MyExtract()

{

string zipToUnpack = "C1P3SML.zip";

string unpackDirectory = "Extracted Files";

using (ZipFile zip1 = ZipFile.Read(zipToUnpack))

{

// here, we extract every entry, but we could extract conditionally

// based on entry name, size, date, checkbox status, etc.

foreach (ZipEntry e in zip1)

{

e.Extract(unpackDirectory, ExtractExistingFileAction.OverwriteSilently);

}

}

}

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

?

1

2

3

4

5

6

7

8

9

10

11

12
static void Main(string[] args)

{

string ZipPath = @"c:\\users\\exampleuser\\start.zip";

string ExtractPath = @"c:\\users\\exampleuser\\extract";

string NewFile = @"c:\\users\\exampleuser\\NewFile.txt";

using (ZipArchive Archive = ZipFile.Open(ZipPath, ZipArchiveMode.Update))

{

Archive.CreateEntryFromFile(NewFile, "NewEntry.txt");

Archive.ExtractToDirectory(ExtractPath);

}

}

以上就是本文的全部内容,希望对大家的学习有所帮助,也希望大家多多支持快网idc。

原文链接:http://www.cnblogs.com/zhaozhan/archive/2012/05/28/2520701.html

收藏 (0) 打赏

感谢您的支持,我会继续努力的!

打开微信/支付宝扫一扫,即可进行扫码打赏哦,分享从这里开始,精彩与您同在
点赞 (0)

声明:本站所有文章,如无特殊说明或标注,均为本站原创发布。任何个人或组织,在未征得本站同意时,禁止复制、盗用、采集、发布本站内容到任何网站、书籍等各类媒体平台。如若本站内容侵犯了原著者的合法权益,可联系我们进行处理。

快网idc优惠网 建站教程 asp.NET中实现文件的压缩和解压(3种方式) https://www.kuaiidc.com/99842.html

相关文章

发表评论
暂无评论