vb.net - VB.NET 2010 - 将应用程序资源提取到桌面
问题描述
我正在尝试从中提取应用程序资源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()
解决方案
首先,您拥有的代码很糟糕。使用 时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 文件执行相同的步骤。如果你是一个动手学习者,那就动手吧。
推荐阅读
- javascript - 将 mongo 查询的输出重定向到 csv 文件会更改日期格式
- python - 我正在尝试将 cmd 上的目录从 js 更改为 python,我该怎么做?
- javascript - 如何生成与对象中的属性关联的数组数据的所有排列?
- json - 将 indexedb 对象存储转换为 json 以使用 post 发送数据
- java - 线程“主”java.util.regex.PatternSyntaxException 中的异常:索引 9 附近的字符范围非法
- list - 如果有一个初始值,我如何创建一个函数,以便这个初始值与一个列表递归相乘?
- python-3.x - 如何在 Matplotlib 中为 LaTeX 方程使用 Arial 字体
- sql - 如何在单个查询中执行具有不同参数的多个连接
- python - 如何展平由字符串组成的列表列表?
- c# - 如何在c#中使用隐式