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

时间:2011-07-20 10:36:42

标签: c# .net clickonce

我一直在使用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建议看看这是否会对点击一次部署产生相同的副作用。

3 个答案:

答案 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)存储在数据目录中时,此数据将从旧版本复制到新版本。这将降低升级后的启动时间。如果您有大量数据,或者您不想担心迁移数据,则可以将数据存储在用户本地文件夹中,只要您拥有完全信任,或者如果您有部分信任,则可以使用独立存储。

Isolated Storage

Local User Application Data