我想使用.net的System.IO.Compression.GZipStream来压缩和解压缩目录。但是我发现它只能压缩单个文件,我怎样才能编写一个可以将特定目录压缩为zip文件的zip类?
ps:我们不允许使用任何第三方zip库
答案 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公共许可证发布的,非常宽松且无病毒条款。