VB. NET 2010 - Извлечение ресурса приложения на рабочий стол - PullRequest
0 голосов
/ 03 августа 2020

Я пытаюсь извлечь ресурс приложения из My.Resources.FILE

Я обнаружил, как это сделать с файлами DLL и EXE, но мне все еще нужна помощь с кодом для извлечения файлов PNG и ICO.

Также и другие типы файлов. (Если возможно)

Вот мой текущий код, который работает с файлами DLL и EXE.

Dim File01 As System.IO.FileStream = New System.IO.FileStream("C:\Users\" + Environment.UserName + "\Desktop\" + "SAMPLE.EXE", IO.FileMode.Create)
            File01.Write(My.Resources.SAMPLE, 0, My.Resources.SAMPLE.Length)
            File01.Close()

1 Ответ

0 голосов
/ 03 августа 2020

Перво-наперво, код у вас плохой. При использовании My.Resources каждый раз, когда вы используете свойство, вы извлекаете новую копию данных. Это означает, что ваша вторая строка получает данные для записи дважды, а во второй раз - только для получения ее длины. По крайней мере, вы должны получать данные только один раз и назначать их переменной, а затем использовать эту переменную дважды. Вы также должны использовать оператор Using для создания и уничтожения FileStream. Даже лучше, просто позвоните File.WriteAllBytes, что означает, что вам не нужно создавать свой собственный FileStream или знать длину записываемых данных. Вы также не должны создавать таким образом путь к файлу.

Dim filePath = Path.Combine(My.Computer.FileSystem.SpecialDirectories.Desktop, "SAMPLE.EXE")

File.WriteAllBytes(filePath, My.Resources.SAMPLE)

Что касается вашего вопроса, важно понять, что он действительно не имеет ничего общего с ресурсами. На самом деле вопрос в том, как сохранять данные любого конкретного типа, и это то, что вы можете найти сами. Когда вы получаете значение свойства из My.Resources, тип получаемых вами данных будет зависеть от типа файла, который вы встроили в первую очередь. В случае двоичного файла, например DLL или EXE, вы получите массив Byte и сохраните эти данные в файл так же, как и любой другой массив Byte. В случае файла изображения, например PNG, вы получите обратно объект Image, поэтому вы сохраните его, как и любой другой объект Image, например,

Dim filePath = Path.Combine(My.Computer.FileSystem.SpecialDirectories.Desktop, "PICTURE.PNG")

Using picture = My.Resources.PICTURE
    picture.Save(filePath, picture.RawFormat)
End Using

Для файла ICO вы вернет объект Icon. Я предоставлю вам исследовать, как сохранить объект Icon в файл.

EDIT:

Важно определить, в чем именно заключается проблема, которую вы пытаетесь решить. решить. Очевидно, вы можете получить объект из My.Resources, так что проблема не в этом. Вам необходимо определить, к какому типу относится этот объект, и определить, как сохранить объект этого типа. Как это сделать, будет одинаково независимо от того, откуда этот объект, поэтому часть ресурсов не имеет значения. Подумайте, что вам нужно сделать, и напишите метод для этого, а затем вызовите этот метод.

В исходном случае вы могли бы начать так:

Dim data = My.Resources.SAMPLE

Один раз вы написали, что даже когда вы это пишете, Intellisense сообщит вам, что данные представляют собой массив Byte. Ваша актуальная проблема теперь заключается в том, как сохранить массив Byte в файл, поэтому напишите метод, который это сделает:

Private Sub SaveToFile(data As Byte(), filePath As String)
    '...
End Sub

Теперь вы можете сделать то, что хотите сделать в первую очередь: написать код для вызова этого метода в зависимости от вашего текущего сценария или напишите реализацию метода. Существуют различные c способы сохранения двоичных данных, т.е. массив Byte, в файл, но, как я уже сказал, самый простой - это File.WriteAllBytes:

Private Sub SaveToFile(data As Byte(), filePath As String)
    File.WriteAllBytes(filePath, data)
End Sub

Что касается вызова метода , вам нужны данные, которые у вас уже есть, и путь к файлу:

Dim data = My.Resources.SAMPLE
Dim folderPath = My.Computer.FileSystem.SpecialDirectories.Desktop
Dim fileName = "SAMPLE.EXE"
Dim filePath = Path.Combine(folderPath, fileName)

SaveToFile(data, filePath)

Достаточно просто. Вам необходимо выполнить те же действия для любого другого ресурса. Если вы внедрили файл PNG, вы обнаружите, что это объект Image или, более конкретно, Bitmap. Затем ваша задача - узнать, как сохранить такой объект в файл. Вам не понадобится много времени, чтобы узнать, что класс Image имеет свой собственный метод Save, поэтому вы должны использовать его в своем методе:

Private Sub SaveToFile(data As Image, filePath As String)
    data.Save(filePath, data.RawFormat)
End Sub

Код для вызова метода в основном как и прежде, за исключением того, что объект image должен быть удален, когда вы закончите с ним:

Dim data = My.Resources.PICTURE
Dim folderPath = My.Computer.FileSystem.SpecialDirectories.Desktop
Dim fileName = "SAMPLE.EXE"
Dim filePath = Path.Combine(folderPath, fileName)

SaveToFile(data, filePath)
data.Dispose()

Правильный способ создания и удаления объекта в узкой области, как это, a Using block:

Dim folderPath = My.Computer.FileSystem.SpecialDirectories.Desktop
Dim fileName = "SAMPLE.EXE"
Dim filePath = Path.Combine(folderPath, fileName)

Using data = My.Resources.PICTURE
    SaveToFile(data, filePath)
End Using

Теперь вы должны выполнить те же действия для файла ICO. Если вы хороший ученик, возьмите в свои руки.

...