我的.exe中有一个嵌入式资源是一个zip文件,我想把它从资源中移出并解压缩到一个特定的文件夹。
Private Sub btnNext_Click(sender As Object, e As EventArgs) Handles btn_Install.Click
Dim Dir_File As String = "C:\FTB"
Dim Dir_Temp As String = "C:\Temp\Unleashed.zip"
System.IO.File.WriteAllBytes(Dir_Temp, My.Resources.Unleashed)
Dim directorySelected As DirectoryInfo = New DirectoryInfo(Dir_Temp)
End Sub
但我无法将.zip文件解压缩到目录中。所以我现在需要的是一种实际提取.zip的方法。
我试过了:
Dim directorySelected As DirectoryInfo = New DirectoryInfo(Dir_Temp)
For Each fileToDecompress As FileInfo In directorySelected.GetFiles("Unleashed.zip")
Using OriginalFileStream As FileStream = fileToDecompress.OpenRead()
Using decompressedFileStream As FileStream = File.Create(Dir_File & "\Unleashed")
Using decompressionStream As GZipStream = New GZipStream(OriginalFileStream, CompressionMode.Decompress)
decompressionStream.CopyTo(decompressedFileStream)
End Using
End Using
End Using
Next
但所有这一切都给了我一个关于幻数的错误。 非常感谢任何帮助。
答案 0 :(得分:3)
您的问题已在此处讨论过:https://stackoverflow.com/a/11273427/2655508
GZipStream类不适合以.gz或.zip格式读取压缩档案。它只知道如何解压缩数据,它对存档文件结构一无所知。其中可以包含多个文件,请注意该类如何无法选择要解压缩的存档中的特定文件。
解决方案是使用.NET 4.5,它包含System.IO.Compression命名空间内所需的类及其用于在zip文件中创建,操作和提取项目的方法。
参见例如System.IO.Compression.ZipFileExtensions.ExtractToDirectory()
答案 1 :(得分:1)
Gzip与zip不同。文件格式由文件的2到4个第一个字节标识: 邮编:50 4b 03 04 Gzip:1f 8b 由于您尝试使用gzip解压缩zip文件,因此会收到一条错误消息,主要告诉您文件不是gzip文件。
请参阅 Unzip files programmatically in .net提出类似问题。 有关幻数,请参阅:http://en.m.wikipedia.org/wiki/Magic_number_(programming)
答案 2 :(得分:1)
如果您可以使用.NET 4.5,它会在System.IO.Compression
命名空间内提供zip文件操作所需的所有内容。
对于zip操作,您可以考虑使用第三方库,如sharpziplib
我在许多项目中成功使用它。
看看这些样本:https://github.com/icsharpcode/SharpZipLib/wiki/Zip-Samples