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

本文关键字:部署 数据 文件 ClickOnce 存储 在哪里 安全 我可以 | 更新日期: 2023-09-27 18:02:47

我一直使用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)只是创建一个不存在的目录。

我发现我的问题的根本原因是我正在创建许多文件和一个索引文件,这个索引文件包含绝对路径,点击一次移动的内容(或副本)在升级,所以绝对路径不再存在。我将按照Damokles的建议研究隔离存储,看看这是否对点击一次部署有同样的副作用。

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

另一个选择是在用户的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))
{
...

摘自本文的代码

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

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

我看到的一件事是,当你有大量的数据(4gig),如果你把它存储在数据目录中,这些数据将从旧版本复制到新版本。这将在升级后减慢启动时间。如果你有大量的数据,或者你不想担心迁移数据,你可以将数据存储在用户的本地文件夹中,如果你有完全的信任,或者你可以使用隔离的存储,如果你有部分信任。

隔离存储

本地用户应用数据