Перво-наперво, код у вас плохой. При использовании 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. Если вы хороший ученик, возьмите в свои руки.