在哪里存储Windows程序数据文件?

7
我的程序包含一个SQLite数据库文件,程序在第一次运行时创建该文件,并将数据存储在其中。随着时间的推移,数据库会逐渐增大。该数据库文件创建在程序的安装目录中。
我经常需要更新应用程序以修复错误,因此我发布一个新的MSI安装程序,该安装程序除了数据库文件外,还会删除旧安装文件并安装新的程序文件。
有些用户选择的安装位置不同,因此他们选择的位置中不存在该数据库文件。
我想知道是否可以将数据文件存储到程序数据文件夹中,而不是安装目录之外的某个位置?这样,每次我的程序更新后都可以从该程序数据文件夹访问数据...?
Windows XP、Vista和7中是否有任何程序数据目录?如何在C#中访问它?

1
这不是一种正常的部署方式,您无法对安装EXE的目录进行写访问。UAC会阻止这样做。文件必须存储在AppData目录中。这也解决了这个问题。 - Hans Passant
3个回答

11

请看Environment.SpecialFolder 枚举,决定数据存储的正确位置。

我会投票选择Recent文件夹,以下是其他选项:

  • ApplicationData(当前用户漫游配置文件)
  • CommonApplicationData(本地计算机上的所有用户)
  • LocalApplicationData(本地计算机上当前用户)

使用以下代码获取您选择的文件夹:

Environment.GetFolderPath(Environment.SpecialFolder.xxx))

8

在应用程序文件夹中存储用户数据非常危险。如果用户更新或卸载您的应用程序,数据不仅会丢失,而且标准用户甚至无法写入应用程序目录。

我通常在应用程序中包含一个种子数据库,并在应用程序启动时将其复制到 Environment.SpecialFolder.ApplicationData 文件夹中的一个文件夹中。所有用户数据都存储在副本中;如果用户卸载应用程序,则种子数据库将被删除,但用户数据仍然存在。请参见此 SO answer 的示例。


什么是IsolatedStorage? - Kiquenet

1

不应将数据存储在安装文件夹中。尝试这个。特殊文件夹是为您设计的,以便您能够存储此类数据。还有应用程序设置,它们易于访问并提供了一种轻松的方式来存储用户键值对,信息


网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接