2013-08-13 3 views
2

У меня есть встроенный ресурс в моем .exe, который является zip-файлом, я хотел бы переместить его из ресурсов и разархивировать его в определенную папку.Разархивировать файл в vb.net

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 

Но все это сделал, дают мне ошибку о магику. Любая помощь очень ценится.

ответ

3

Ваша проблема Allready обсуждается здесь: https://stackoverflow.com/a/11273427/2655508

GZipStream класс не подходит для чтения сжатых архивов в .gz или .zip. Он знает только, как удалить/сжать данные, он ничего не знает о структуре архивного файла. Что может содержать несколько файлов, обратите внимание на то, как класс не имеет способа выбрать конкретный файл в архиве, который вы хотите распаковать.

Решение состоит в использовании NET 4.5, который содержит внутри пространства имен System.IO.Compression необходимые классы с их методами для создания, обработки и извлечения элементов в/из zip-файла.

См., Например, System.IO.Compression.ZipFileExtensions.ExtractToDirectory()

1

Gzip отличается от zip. Формат файла идентифицируется с 2 по 4 первых байта файла: Почтовый индекс: 50 4b 03 0 Gzip: 1f 8b Поскольку вы пытаетесь распаковать zip-файл с помощью gzip, вы получаете сообщение об ошибке, в котором сообщается, что ваш файл не является файлом gzip.

См. Unzip files programmatically in .net для подобных вопросов. Для магику см: http://en.m.wikipedia.org/wiki/Magic_number_(programming)

1

Если вы можете использовать NET 4.5 он поставляется внутри System.IO.Compression пространства имен и все вещи, необходимые для манипуляции архива.

Для обработки почтовых сообщений вы можете использовать стороннюю библиотеку, например sharpziplib Я использую ее с успехом во многих проектах.

Взгляните на эти образцы: https://github.com/icsharpcode/SharpZipLib/wiki/Zip-Samples