我一直在使用ApplicationDeployment.CurrentDeployment.DataDirectory
存储客户端在运行时下载的内容,每次应用程序启动时都会存在这些内容,但是现在我发现如果应用程序更新,这些更改似乎是随机的。< / p>
在单击一次部署中为应用程序存储用户数据的最可靠方法是什么?
目前我一直在使用以下方法
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
下的文章Accessing Local and Remote Data in ClickOnce Applications,该文章指出这是推荐路径。
注意:CreateDirectory(string)
只是创建一个目录(如果该目录尚不存在)。
我发现问题的根本原因是我正在创建许多文件和索引文件,这个索引文件包含绝对路径,click-once会在升级时移动内容(或副本),所以绝对路径没有更长的存在。我将研究隔离存储,因为Damokles建议看看这是否会对点击一次部署产生相同的副作用。
答案 0 :(得分:20)
另一种选择是在用户的AppData文件夹中为您的应用程序创建一个目录并将其存储在那里。您可以通过以下方式获得该路径:
Environment.GetFolderPath(Environment.SpecialFolder.ApplicationData)
你会发现很多应用程序使用它(它是本地等效的)。它也不会在ClickOnce版本之间移动。
答案 1 :(得分:5)
查看IsolatedStorage这应该会有所帮助。 它甚至可以在部分信任环境中使用。
要为您提供数据,您需要使用application scoped IsolatedStorage
using System.IO;
using System.IO.IsolatedStorage;
...
IsolatedStorageFile appScope = IsolatedStorageFile.GetUserStoreForApplication();
using(IsolatedStorageFileStream fs = new IsolatedStorageFileStream("data.dat", FileMode.OpenOrCreate, appScope))
{
...
代码来自this post
答案 2 :(得分:4)
这取决于您要保存的数据。
您目前正在保存到数据目录,这很好。您需要注意的是,每个版本的应用程序都有自己的数据目录。更新ClickOnce时,应用程序启动时会将先前版本中的所有数据复制到新版本。这为您提供了一个钩子,可以将任何数据从一个版本迁移到另一个版本。这适用于Sql Lite或SQL CE等内存数据库。
我所了解的一件事是,当您将大量数据(4 gig)存储在数据目录中时,此数据将从旧版本复制到新版本。这将降低升级后的启动时间。如果您有大量数据,或者您不想担心迁移数据,则可以将数据存储在用户本地文件夹中,只要您拥有完全信任,或者如果您有部分信任,则可以使用独立存储。