|DataDirectory|
不是来自配置设置;你混合了三种不同的东西:
ConfigurationManager.AppSettings["DataDirectory"]
这来自配置设置;您必须创建一个 .config 文件并将其放入项目中。此特定设置是元素中带有键"DataDirectory"
的AppSettings
元素的值。除非您在 .config 文件中放置一个,否则它不存在。通常,这是您放置永远不会更改的配置或启动数据的地方。您不应将文件路径放在这里,因为它们在用户安装数据库的机器上可能不同。
Environment.GetFolderPath(Environment.SpecialFolder.ApplicationData)
这是当前用户的漫游应用程序数据文件夹的路径,由安装您的应用程序的操作系统定义。您无法更改它,它是由操作系统定义的。您可以确定此文件夹是用户可写的,如果用户卸载您的应用程序不会被删除,并且如果用户漫游或从另一台机器登录时可用。这通常是您想要放置可编辑应用程序数据的位置。
SqlConnection("Data Source=|DataDirectory|DatabaseFileName.sdf;...")
这是 ADO.NET 连接的连接字符串。ADO.NET 对竖线进行了特殊处理,它在竖线之间查找与键名匹配的 AppDomain 数据。您可以通过以下方式获得相同的数据:
AppDomain.CurrentDomain.GetData("DataDirectory")
那么 的值是DataDirectory
什么?它由部署您的可执行文件的任何方式完成:
- .MSI 安装程序将其定义为应用程序的目标文件夹。
- ClickOnce 在您的项目中定义了一个特殊的数据文件夹。
- Web 应用程序使用 App_Data 文件夹。
- Visual Studio 调试器使用调试文件夹。
请注意,.MSI 安装程序可以允许用户更改 DataDirectory;这就是为什么您永远不应该硬编码或更改的原因DataDirectory
,如果您这样做,就无法找到您的应用程序数据的部署位置。您通常将该DataDirectory
文件夹用于与可执行文件一起部署的只读二进制数据。
如果您需要写入与您的可执行文件一起部署的数据,您应该首先将其复制到您知道用户将能够写入的地方,例如 to Environment.SpecialFolder.ApplicationData
,然后写入副本。不仅DataDirectory
不一定是用户可写的,它是部署的一部分,而不是用户数据的一部分;如果您修复或卸载可执行文件,则会DataDirectory
重新安装或删除。当您删除他们的数据时,用户不喜欢它,因此不要将其保存到DataDirectory
.