是否可以在只使用.NET或其他内置Windows API来维护层次结构的同时解压缩zip文件
本文关键字:层次结构 维护 API 文件 zip 解压缩 Windows 内置 其他 NET 是否 | 更新日期: 2023-09-27 17:57:36
我有一个包含文件夹层次结构和文件的zip文件。
'images'
'images'1.jpg
'images'2.jpg
'something'something'a.exe
'something'something'b.exe
1.txt
我需要将这个zip文件的内容解压缩到一个位置。我还需要保留zip文件的结构。
我读过关于.NET的GZipStream和DeflateStream的文章,但我认为它对我的目的来说太"复杂"了。
我过去也曾在个人项目中使用过DotNetZip和SharpZipLib,但由于这与工作有关,而且我在一家大公司工作,我很难说服法律人员使用这些库。
问题:在只使用.NET或其他内置的Windows API来维护层次结构的同时,是否可以解压缩zip文件?
附言:我也读过这篇文章,但我认为它很有技巧,因为你需要生成另一个可执行文件来隐藏进度对话框。
谢谢!
查看Ionic Zip是否有帮助?
DotNetZip可以随心所欲,但我理解您对法律批准的担忧。
顺便说一句,你可以在与批准在公司使用开源库相关的法律丛林中穿行,只是为了了解其中的内容。但我会把这件事留给你。
回到滚动自己。。。DotNetZip功能非常齐全,它可以处理许多你可能不关心的场景。像Unicode文件名和注释一样,设置提取文件的windows时间戳和权限,获取在旧unix系统上创建的zip文件的时间戳,拆分归档、加密归档、超过2gb的文件或自提取归档等。许多zip文件都不使用这些东西。
此外,DotNetZip还进行事件处理、zip更新和zip创建——如果你只局限于你在问题中描述的需求,那么与这些事情相关的所有代码可能对你不感兴趣。
不过,您可以获取DotNetZip代码,并使用它来帮助您推出自己的解决方案。如果您仅限于读取zip文件,而不处理所有可能的特殊情况,那么zip格式并不难解析。
以下是操作方法:
-
使用
new FileStream()
或File.Open
打开zip文件。您想要一个FileStream
对象。 -
读取4个字节。验证它是否是zip条目头描述符。(0x04034b50)在文件中,这些字节的顺序是50 4b 03 04。
-
如果你找到了匹配的人,那你就是在做生意。
- 在偏移14处是一个4字节的CRC。获取它。(与上面的字节顺序相同)
- 在偏移量18处——压缩斑点的4字节长度。明白了。(N)
- 在偏移量22处-未压缩blob的4字节长度。明白了。(U)
- at 26-文件名的2字节长度。明白了(L)
- at 28-"额外字段"的2字节长度。明白了(E)
-
在偏移量为30的额外字段之外,是实际的文件名。读取文件名的L字节,然后调用System.Text.Encoding.ASCII.GetString()。结果将包括一个目录路径,反斜杠替换为斜杠(unix样式)。String.Replace()斜杠。
-
文件名后面是额外的字段-查找E字节以超出它。你可以忽略它。这是压缩数据的开始。
-
使用CompressionMode.Descress并使用FileStream的当前偏移量作为输入,在zip FileStream上打开System.IO.DeflateStream()。打开一个新的FileStream,使用您在步骤3中读取的文件路径进行输出。在一个循环中,呼叫充气机。Read()。和输出。Write(),将DeflateStream的解压缩输出写入到具有正确名称的文件系统文件中。当您完全读取U(未压缩)字节时,您需要停止从DeflateStream中读取。
-
将未压缩的大小(U)与您实际从DeflateStream中写入的数据(压缩后)进行比较。它们应该匹配。
-
如果您感兴趣,您可以根据标头中的内容检查输出的CRC。
-
转到步骤2,查找文件中的下一个条目。
最复杂的部分是步骤3。在这个源模块中很容易找到的工作代码,请查找ReadHeader方法。
也许GZipStream的完整功能集有点复杂,但请注意,msdn页面中的示例正是您所需要的。我的意思是这个msdn网站(4.0版本)不是你在问题中提供的。
http://msdn.microsoft.com/en-us/library/system.io.compression.gzipstream.aspx#Y2750