Где я могу безопасно хранить файлы данных для развертывания 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 гигабайта), если вы храните его в каталоге данных, эти данные будут скопированы из старой версии в новую. Это замедлит время запуска после обновления. Если у вас большой объем данных или вы не хотите беспокоиться о переносе данных, вы можете хранить данные в локальной папке пользователей, предоставляя вам полное доверие, или вы можете использовать изолированное хранилище, если у вас есть частичное доверие.
Изолированное хранилище
Локальные данные пользовательских приложений