首先,您拥有的代码很糟糕。使用 时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
对象保存到文件中。
编辑:
确定您要解决的实际问题是什么很重要。您显然可以从中获取对象,My.Resources
因此这不是问题。您需要确定该对象是什么类型,并确定如何保存该类型的对象。无论该对象来自何处,如何做到这一点都是一样的,因此资源部分是无关紧要的。想想你必须做什么并编写一个方法来完成它,然后调用该方法。
在你原来的情况下,你可以这样开始:
Dim data = My.Resources.SAMPLE
一旦你写了——即使你写它——Intellisense 会告诉你数据是一个Byte
数组。您现在的实际问题是如何将Byte
数组保存到文件中,因此请编写一个方法来执行此操作:
Private Sub SaveToFile(data As Byte(), filePath As String)
'...
End Sub
您现在可以先做您想做的事情:编写代码以根据当前场景调用该方法或编写该方法的实现。有多种特定方法可以将二进制数据(即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()
在像这样的狭窄范围内创建和处置对象的正确方法是使用Using
块:
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 文件执行相同的步骤。如果你是一个动手学习者,那就动手吧。