c# - 如何读取程序加载解决方案一部分的文件?

标签 c# winforms visual-studio sqlite

我正在编写一个 C# WinForms 应用程序,该应用程序的组件之一是 SQLite 数据库。

如果用户第一次运行该程序,该程序应该在用户的主目录中创建必要的文件夹和文件(即数据库文件)。效果很好。

但是还需要建立数据库(即需要添加表)。我有一个 SQL 脚本来创建必要的表;但是,它当前存储在解决方案目录中,我不确定这是否是程序实际打包到 .exe 文件中的最佳实践。

每次需要设置数据库时,脚本都是相同的,所以我认为可能有几个选项:

  • 让程序读取 SQL 脚本并将其应用到数据库(除非有更好的方法,否则首选)

  • 将脚本文件的内容加载到内存中(将其硬编码为字符串)并让应用程序以这种方式运行(不推荐,因为 future 的版本,需要是一种更新现有结构的方法,以免删除现有数据库,因此这种方法可能会变得复杂)

  • 将 SQL 脚本作为程序包的一部分或独立文件包含(非常危险,因为用户不应该知道这一点)

那么从“伴随”脚本文件运行 SQL 语句的最佳方法是什么?当程序准备好投入生产时,如何打包所有这些内容?如何确保程序每次需要时都可以访问该文件?

最佳答案

您可以设置要在输出目录中复制的文件。在解决方案资源管理器中选择文件,然后在属性窗口中设置 Copy to Output Directory始终复制。这样,文件将被复制到输出目录中,您可以这样加载它:

var path = System.IO.Path.Combine(Application.StartupPath, @"Script.txt");
var content = System.IO.File.ReadAllText(path);

如果文件位于解决方案的根目录中,请使用上述文件名。如果该文件位于解决方案中的文件夹中(例如,Folder1 中的文件),请在上面的代码中使用 @"Folder1\Script.txt"

作为另一个选项,您可以将文件添加到 Resources.resx。然后它将包含在资源中,您可以通过以下方式简单地访问它:

var content = Properties.Resources.Script;

关于c# - 如何读取程序加载解决方案一部分的文件?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/38034392/

相关文章:

c# - 如何将电子邮件从 Outlook 拖放到 .NET 应用程序中?

c# - 自定义控件不会在设计器中公开图像属性

c# - .NET 中的强类型控件

c++ - Visual Studio 跳过代码行

asp.net - 无法评估表达式

c# - 以编程方式向 ListView 发送点击消息以选择/取消选择项目

c# - 如何摆脱子元素中的空命名空间 "xmlns="""?

visual-studio - 固定Fortran延续行中的无法识别 token '&'

c# - 网页上的移动图像

c# - C# winforms中有像Flex中 "ViewStack"这样的控件吗?