c# - 是否可以将文件存储在 C# 项目中并在需要时创建它?
问题描述
我只是想知道是否可以将文件存储在 C# (Winform) 项目中并在需要时创建它?基本场景:我的项目使用数据库文件来存储数据(简单访问 .mdb 文件),如果打开 exe 时它不存在,它将创建存储的文件,以便用户仍然可以使用该程序。(我需要那个数据库文件,一个简单的 txt 不适合,它是我考试的存储管理器应用程序)
我什至不知道如何搜索它,这可能是不可能的。我不能使用网站下载备份的文件,它不允许用于考试。
解决方案
是的,有可能。
您可以通过将文件设置为嵌入资源将文件存储在 Dll 或可执行文件中。因此,将文件添加到您的项目中,然后在 Visual Studio 中单击它并在属性窗格中将其“构建操作”从“内容”更改为“嵌入资源”
当您编译程序时,这将导致文件包含在二进制文件的可执行文件或 Dll 的资源部分中。
在您的代码中,您可以通过 System.Reflection 命名空间中的 Assembly 类访问嵌入的资源。该方法称为“GetManifestResourceStream”,它是一个实例化方法。因此,您需要获取对嵌入资源所在的程序集的引用。如果它在当前可执行文件中,只需使用 System.Reflection.Assembly.GetEntryAssembly()。
GetManifestResourceStream 方法接受嵌入资源名称的名称。该名称由您作为嵌入资源添加的文件的命名空间决定。因此,如果您将文件放在项目的根目录中,那么它将是项目默认命名空间加上文件名的任何内容。
因此,假设您添加了“trees.png”并将其放在项目根目录中名为“Images”的文件夹中。现在假设项目根命名空间是 XYZ.ImageEditor。因此,提供给 GetManifestResourceStream 的嵌入资源的名称将是“XYZ.ImageEditor.Images.trees.png”。
还有一个名为 GetManifestResourceNames() 的方法将返回程序集中嵌入的所有资源名称的列表,因此该列表中将返回 trees.png 的全名。您可以使用它来枚举嵌入在程序集中的文件。
拥有资源流后,您可以使用 System.IO.File.WriteAllText 或 System.IO.File.WriteAllBinary 等将其写入文件。或者手动打开文件流并从资源流中读取的字节写入文件. 这部分有很多不同的方法。
推荐阅读
- java - 进度条 NullPointerException
- sql-server - 从两个 CSC 文件中读取数据,使用 Join 使用 SSIS 存储表
- python - 使用@patch 装饰器模拟属性
- javascript - 单击关闭图标后如何删除具有相同类名的当前列表项
- linux - 使用 awk 或 sed 比较两个文件的值,并将文件 2 中的信息附加到文件 1 到新文件 file3
- mysql - centos 5.7 之前的服务器无法升级到 8.0。服务器启动失败
- javascript - highchart : 创建股票图表
- php - Slim 显示类未找到错误,即使类存在
- matlab - 如何查看 MATLAB 中变量使用的实际内存?
- java - 从java中的linux设备char文件中读取字节