在哪里可以安全地存储ClickOnce部署的数据文件?

我一直在使用ApplicationDeployment.CurrentDeployment.DataDirectory来存储客户端在运行时下载的内容,每次应用程序启动时都会存在这些内容,但是现在我发现如果应用程序更新,这种变化似乎是随机的。

在单击一次部署中为应用程序存储用户数据的最可靠方法是什么?

目前我一直在使用以下方法

 private const string LocalPath = "data"; public string GetStoragePath() { string dir; if (ApplicationDeployment.IsNetworkDeployed) { ApplicationDeployment ad = ApplicationDeployment.CurrentDeployment; dir = Path.Combine(ad.DataDirectory, LocalPath); } else { dir = LocalPath; } return CreateDirectory(dir); } 

我最初遵循ClickOnce Data Directory标题下的ClickOnce应用程序中的访问本地和远程数据一文,该文章指出这是推荐路径。

注意CreateDirectory(string)只是创建一个目录(如果它尚不存在)。

我发现问题的根本原因是我正在创建许多文件和索引文件,这个索引文件包含绝对路径,click-once会在升级时移动内容(或副本),因此绝对路径不再存在。 我将调查隔离存储,因为Damokles建议查看这是否对单击一次部署具有相同的副作用。

另一种选择是在用户的AppData文件夹中为您的应用程序创建一个目录并将其存储在那里。 你可以通过这个获得一条路径:

 Environment.GetFolderPath(Environment.SpecialFolder.ApplicationData) 

你会发现很多应用程序都使用它(它是本地的等价物)。 它也不会在ClickOnce版本之间移动。

查看IsolatedStorage这应该有所帮助。 它甚至可以在部分信任环境中使用。

为了保证数据的存在,您需要使用应用程序范围的IsolatedStorage

 using System.IO; using System.IO.IsolatedStorage; ... IsolatedStorageFile appScope = IsolatedStorageFile.GetUserStoreForApplication(); using(IsolatedStorageFileStream fs = new IsolatedStorageFileStream("data.dat", FileMode.OpenOrCreate, appScope)) { ... 

从这篇文章中获取的代码

这取决于您要保存的数据。

您当前正在保存到数据目录,这很好。 您需要注意的是,每个版本的应用程序都有自己的数据目录。 更新ClickOnce时,应用程序启动时会将先前版本中的所有数据复制到新版本。 这为您提供了一个钩子,可以将任何数据从一个版本迁移到另一个版本。 这对于像Sql Lite或SQL CE这样的内存数据库很有用。

我所了解的一件事是,当您将大量数据(4 gig)存储在数据目录中时,此数据将从旧版本复制到新版本。 这将降低升级后的启动时间。 如果您有大量数据或者您不想担心迁移数据,则可以将数据存储在用户本地文件夹中,只要您具有完全信任,或者如果您具有部分信任,则可以使用独立存储。

隔离存储

本地用户应用数据