Где я могу безопасно хранить файлы данных для развертывания 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 под заголовком ClickOnce Data Directory, в котором говорится, что это рекомендуемый путь.

ПРИМЕЧАНИЕ: CreateDirectory(string) просто создает каталог, если он еще не существует.

Я нашел основную причину моей проблемы: я создаю много файлов и индексный файл, этот индексный файл содержит абсолютные пути, один раз перемещает содержимое (или копии) при обновлении, поэтому абсолютные пути нет дольше. Я буду исследовать изолированное хранилище, так как Damokles предлагает проверить, имеет ли это одно и то же влияние на развертывание с щелчком мыши.

Ответы

Ответ 1

Другой вариант - создать каталог для вашего приложения в папке AppData пользователя и сохранить его там. Вы можете получить путь к этому с помощью этого:

Environment.GetFolderPath(Environment.SpecialFolder.ApplicationData)

Вы найдете много приложений, которые используют (и это локальный эквивалент). Он также не перемещается между версиями ClickOnce.

Ответ 2

Откажитесь от IsolatedStorage, это должно помочь. Он работает даже в среде с частичным доверием.

Чтобы сохранить данные, вам необходимо использовать приложение с изоляцией IsolStorage

using System.IO;
using System.IO.IsolatedStorage;
...

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

код, взятый из этого сообщения

Ответ 3

Это зависит от данных, которые вы сохраняете.

В настоящее время вы сохраняете данные в каталоге данных, это нормально. Что вам нужно знать, так это то, что каждая версия приложения имеет свой собственный каталог данных. При обновлении ClickOnce копирует все данные из предыдущей версии в новую версию при запуске приложения. Это дает вам возможность перенести любые данные из одной версии в другую. Это хорошо для баз данных памяти, таких как Sql Lite или SQL CE.

Одна вещь, с которой я сталкиваюсь, заключается в том, что когда у вас есть большой объем данных (4 гигабайта), если вы храните его в каталоге данных, эти данные будут скопированы из старой версии в новую. Это замедлит время запуска после обновления. Если у вас большой объем данных или вы не хотите беспокоиться о переносе данных, вы можете хранить данные в локальной папке пользователей, предоставляя вам полное доверие, или вы можете использовать изолированное хранилище, если у вас есть частичное доверие.

Изолированное хранилище

Локальные данные пользовательских приложений