Сохранение файла в изолированном хранилище

Я работаю над заданием по программе журнала успеваемости для класса; детали не так важны, кроме как знать, что мне нужно сохранить файл и вызвать его позже. Я знаю, как сериализовать, десериализовать и т. Д., И там все хорошо. Но проблема возникает, когда я пытаюсь сэкономить. Я немного новичок во всей сцене сохранения данных, и я точно не знаю методов, но то, что у меня есть, похоже, должно работать - за исключением того, что каждый раз, когда я пытаюсь это сделать, я получаю сообщение об ошибке.

private static void Save (IList<GradebookEntry> gradebook) {
        Console.WriteLine ("Saving changes. Please wait...");
        using (IsolatedStorageFile stored = IsolatedStorageFile.GetStore (IsolatedStorageScope.User | IsolatedStorageScope.Assembly, null, null)) {
            try {
                using (IsolatedStorageFileStream isoStream = new IsolatedStorageFileStream ("Temp.utc", FileMode.Create, stored)) {
                    BinaryFormatter bform = new BinaryFormatter ();
                    bform.Serialize (isoStream, gradebook);
                    string[] s = stored.GetDirectoryNames ();
                    stored.DeleteFile ("Gradebook.utc");
                    stored.MoveFile ("Temp.utc", "Gradebook.utc"); // #!!
                }
                Console.WriteLine ("Changes saved.");
            }
            catch (Exception ex) {
                Console.WriteLine ("Saving failed. Reason: {0}", ex.Message);
            }
            finally {
                if (stored.FileExists("Temp.utc")) {
                    stored.DeleteFile ("Temp.utc");
                }
            }
        }
    }

Отмеченная строка, куда я пытаюсь переместить файл, - это то место, где у меня возникают проблемы. Все остальное работает нормально, но когда я дохожу до этой строки, возникает исключение IsolatedStorageException с сообщением «Операция запрещена». Я просмотрел все, я изучил MSDN, я обыскал все места, где мог, но не могу понять, в чем проблема. Вероятно, я просто не заметил этого, но я рву волосы здесь и мне нужна небольшая помощь. Спасибо.


person MutantOctopus    schedule 02.10.2015    source источник
comment
Вы пробовали переместить файл за пределы оператора isoStream using?   -  person archon    schedule 02.10.2015
comment
Эй, вот и все. Спасибо, @archon. Не знаю, почему я не подумал об этом. Не похоже, чтобы что-то имело значение, хех.   -  person MutantOctopus    schedule 02.10.2015


Ответы (1)


Чтобы развернуть комментарий архонта, операция перемещения завершается неудачно, поскольку находится внутри блока using. Изменение кода следующим образом устраняет проблему.

using (IsolatedStorageFileStream isoStream = 
            new IsolatedStorageFileStream("Temp.utc", FileMode.Create, stored)) 
{
    BinaryFormatter bform = new BinaryFormatter();
    bform.Serialize(isoStream, gradebook);
}
stored.DeleteFile("Gradebook.utc");
stored.MoveFile("Temp.utc", "Gradebook.utc");

Причина, по которой почему не удается, заключается в том, что в блоке using файл Temp.utc открыт, а открытый файл нельзя переместить. Как только выполнение выходит из блока using, isoStream вызывается метод Dispose, который заставляет его закрыть открытый файл.

person theB    schedule 02.10.2015
comment
Спасибо чувак. Кажется, это должен быть очевидный ответ, но, полагаю, я никогда не думал об этом правильно. - person MutantOctopus; 02.10.2015