首页 > 解决方案 > 是否可以将文件存储在 C# 项目中并在需要时创建它?

问题描述

我只是想知道是否可以将文件存储在 C# (Winform) 项目中并在需要时创建它?基本场景:我的项目使用数据库文件来存储数据(简单访问 .mdb 文件),如果打开 exe 时它不存在,它将创建存储的文件,以便用户仍然可以使用该程序。(我需要那个数据库文件,一个简单的 txt 不适合,它是我考试的存储管理器应用程序)

我什至不知道如何搜索它,这可能是不可能的。我不能使用网站下载备份的文件,它不允许用于考试。

标签: c#databasewinformsms-access

解决方案


是的,有可能。

您可以通过将文件设置为嵌入资源将文件存储在 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 等将其写入文件。或者手动打开文件流并从资源流中读取的字节写入文件. 这部分有很多不同的方法。


推荐阅读