0

我正在尝试从中提取应用程序资源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()
4

1 回答 1

0

首先,您拥有的代码很糟糕。使用 时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 文件执行相同的步骤。如果你是一个动手学习者,那就动手吧。

于 2020-08-03T07:38:36.840 回答