2

我的 .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

但所做的只是给了我一个关于幻数的错误。很感谢任何形式的帮助。

4

3 回答 3

3

您的问题已在此处讨论:https ://stackoverflow.com/a/11273427/2655508

GZipStream 类不适合读取 .gz 或 .zip 格式的压缩档案。它只知道如何解压缩数据,对存档文件结构一无所知。其中可以包含多个文件,请注意该类如何无法选择要解压缩的存档中的特定文件。

解决方案是使用 NET 4.5,它在 System.IO.Compression 命名空间内包含所需的类及其用于在 zip 文件中创建、操作和提取项目的方法。

参见例如System.IO.Compression.ZipFileExtensions.ExtractToDirectory()

于 2013-08-13T07:28:02.630 回答
1

Gzip 与 zip 不同。文件格式由文件的前 2 到 4 个字节标识: Zip: 50 4b 03 04 Gzip: 1f 8b 由于您尝试使用 gzip 解压缩 zip 文件,因此您会收到一条错误消息,主要是告诉您您的文件不是一个 gzip 文件。

有关类似问题,请参阅 在 .net 中以编程方式解压缩文件。幻数见:http://en.m.wikipedia.org/wiki/Magic_number_(programming)

于 2013-08-13T07:42:42.460 回答
1

如果您可以使用 NET 4.5,它会在System.IO.Compression命名空间内提供,并提供 zip 文件操作所需的所有内容。

对于 zip 操作,您可以考虑使用第三方库,就像sharpziplib我在许多项目中成功使用它一样。

看看这些样本:https ://github.com/icharpcode/SharpZipLib/wiki/Zip-Samples

于 2013-08-13T10:07:57.307 回答