«Не удалось найти файл» при использовании изолированного хранилища - PullRequest
5 голосов
/ 16 сентября 2008

Я сохраняю вещи в файле Isolated Storage (используя класс IsolatedStorageFile). Он работает хорошо, и я могу получить сохраненные значения при вызове методов сохранения и получения в моем слое DAL из моего слоя GUI. Тем не менее, когда я пытаюсь получить те же настройки из другой сборки в том же проекте, это дает мне FileNotFoundException. Что я делаю не так? Это общая концепция:

    public void Save(int number)
    {
        IsolatedStorageFile storage = IsolatedStorageFile.GetMachineStoreForAssembly();
        IsolatedStorageFileStream fileStream =
            new IsolatedStorageFileStream(filename, FileMode.OpenOrCreate, storage);

        StreamWriter writer = new StreamWriter(fileStream);
        writer.WriteLine(number);
        writer.Close();
    }

    public int Retrieve()
    {
        IsolatedStorageFile storage = IsolatedStorageFile.GetMachineStoreForAssembly();
        IsolatedStorageFileStream fileStream = new IsolatedStorageFileStream(filename, FileMode.Open, storage);

        StreamReader reader = new StreamReader(fileStream);

        int number;

        try
        {
            string line = reader.ReadLine();
            number = int.Parse(line);
        }
        finally
        {
            reader.Close();
        }

        return number;
    }

Я пытался использовать все области действия GetMachineStoreFor *.

РЕДАКТИРОВАТЬ: так как мне нужно несколько сборок для доступа к файлам, кажется, что невозможно сделать с изолированным хранилищем, если это не приложение ClickOnce .

Ответы [ 2 ]

4 голосов
/ 16 сентября 2008

Когда вы создали экземпляр IsolatedStorageFile, вы добавили его в IsolatedStorageScope.Machine?

Хорошо, теперь, когда вы проиллюстрировали свой стиль кода, и я вернулся к повторному тестированию поведения методов, вот объяснение:

  • GetMachineStoreForAssembly () - в области видимости машины и идентификатора сборки. Различные сборки в одном приложении будут иметь свое собственное изолированное хранилище.
  • GetMachineStoreForDomain () - неправильное на мой взгляд. ограничен областью действия машины и идентификатором домена поверх идентификатора сборки. Должна была быть опция только для одного AppDomain.
  • GetMachineStoreForApplication () - это то, что вы ищете. Я проверил это, и различные сборки могут подобрать значения, записанные в другой сборке. Единственная загвоздка в том, что идентификатор приложения должен быть проверяемым. При локальном запуске он не может быть определен должным образом и в результате возникнет исключение «Невозможно определить идентификатор приложения вызывающей стороны». Это можно проверить, развернув приложение с помощью Click Once. Только тогда этот метод может применяться и достичь желаемого эффекта общего изолированного хранилища.
1 голос
/ 16 сентября 2008

При сохранении вы вызываете GetMachineStoreForDomain, но при извлечении вы вызываете GetMachineStoreForAssembly.

GetMachineStoreForAssembly находится в области сборки, в которой выполняется код, а GetMachineStoreForDomain - в области текущего запущенного AppDomain и сборки, в которой выполняется код. Просто измените эти вызовы на GetMachineStoreForApplication, и он должен работать.

Документацию для IsolatedStorageFile можно найти по адресу http://msdn.microsoft.com/en-us/library/system.io.isolatedstorage.isolatedstoragefile_members.aspx

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...