如何在.net中编写自己的zip类

时间:2009-08-27 03:48:53

标签: .net zip

我想使用.net的System.IO.Compression.GZipStream来压缩和解压缩目录。但是我发现它只能压缩单个文件,我怎样才能编写一个可以将特定目录压缩为zip文件的zip类?

ps:我们不允许使用任何第三方zip库

5 个答案:

答案 0 :(得分:4)

你应该先对文件进行TAR。

修改

如果您喜欢冒险,为什么不设计自己的标题并按顺序编写每个压缩文件。将所有文件名存储在标题中以及它们开始位置的索引。

答案 1 :(得分:3)

有很多关于.zip文件格式的文档。维基百科是一个很好的起点: http://en.wikipedia.org/wiki/ZIP_file_format

您可以使用System.IO.Compression.DeflateStream进行实际压缩,但是您需要CRC32实现,并且您需要使用正确的标题来布局文件等。

非平凡工作量。

如果您无法使用开源库,可以考虑购买商业.zip库。使用商业图书馆**不应该有任何法律问题,购买许可证的成本几乎肯定比自己开发和测试图书馆的成本低。另外,检查一下。您的公司可能已拥有商业图书馆的许可证。

**我不是律师,所以请咨询您的法律联系人。

答案 2 :(得分:2)

如果您使用的是3.0+,则可以使用System.IO.Packaging创建zip文件。

答案 3 :(得分:1)

使用System.IO.Directory和System.IO.File类枚举所有文件和文件夹,递归执行以确保您在子文件夹中获取文件。一旦你将所有文件一次拉出一个(或使用线程池),你应该拥有你需要的东西。

答案 4 :(得分:1)

您有几个选择

<强> 1。使用Shell.Application
你可以打电话给壳牌。在VBScript中它看起来像这样:

dim sa
set sa = CreateObject("Shell.Application")

Dim zip
Set zip = sa.NameSpace(pathToZipFile)

Dim d
Set d = sa.NameSpace(dirToZip)


For Each s In d.items
    WScript.Echo  s
Next


' http://msdn.microsoft.com/en-us/library/bb787866(VS.85).aspx
' ===============================================================
' 2nd arg is a bit field: 
' 4 = do not display a progress box
' 16 = Respond with "Yes to All" for any dialog box that is displayed.
' 128 = Perform the operation on files only if a wildcard file name (*.*) is specified. 
' 256 = Display a progress dialog box but do not show the file names.
' 2048 = Version 4.71. Do not copy the security attributes of the file.
' 4096 = Only operate in the local directory. Don't operate recursively into subdirectories.

WScript.Echo "copying files..."

zip.CopyHere d.items, 4

' CopyHere is asynchronous. Gotta wait til it's done. 
sLoop = 0
Do Until d.Items.Count <= zip.Items.Count
    Wscript.Sleep(1000)
Loop

我不知道这是否可以从托管代码访问,但我猜是这样。不过对我来说这感觉有点像黑客。

此外,您需要在向其添加内容之前预先初始化zipfile:

Dim fso
Set fso = CreateObject("Scripting.FileSystemObject")
Dim file
Set file = fso.CreateTextFile(pathToZipFile)

file.Write Chr(80) & Chr(75) & Chr(5) & Chr(6) & String(18, 0)

file.Close
Set fso = Nothing
Set file = Nothing

<强> 2。自己实施
如果您不想使用Shell.Application,理论上您可以创建自己的zip类实现而不会有太多麻烦,特别是如果您的要求有限。如果你没有实现加密,zip64,Unicode,高分辨率时间戳,流媒体等等,zip格式并不是非常复杂......

第3。进行法律审查和重复使用
而不是花费工程时间开发新的实现,而是调查现在的实现。有些人担心使用SharpZipLib的GPL。 DotNetZip是根据Microsoft公共许可证发布的,非常宽松且无病毒条款。