如何在程序加载时读取属于解决方案一部分的文件?

时间:2016-06-26 01:13:20

标签: c# winforms visual-studio sqlite

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

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

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

每次需要设置数据库时脚本都是一样的,所以我想可能有几个选项:

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

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

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

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

2 个答案:

答案 0 :(得分:3)

您可以设置要在输出目录中复制的文件。在解决方案资源管理器中选择文件,然后在属性窗口中,将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;

答案 1 :(得分:0)

包含sql文件的加密版本。让你的程序加载,解密然后执行它。至少我就是这样做的。