将文件保存在隔离存储中

Saving file in isolated storage

我正在为 class 编写成绩簿程序作业;细节不是那么重要,除了知道我需要能够保存文件并在以后调用它。我知道如何序列化、反序列化等,一切都很好。但是当我尝试保存时,问题就来了。我对整个保存数据场景有点陌生,我并不完全了解这些技术,但我所拥有的似乎应该有效 - 除了每次尝试时,我都会收到错误消息。

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");
                }
            }
        }
    }

我尝试移动文件的标记行是我遇到问题的地方。其他一切正常,但当我到达那条线时,它会抛出一个带有消息 "Operation not permitted" 的 IsolatedStorageException。我查看了所有地方,研究了 MSDN,搜索了所有可能的地方,但我无法弄清楚问题出在哪里。这可能只是我忽略的事情,但我在这里撕毁了我的头发,我需要一些帮助。谢谢

要扩展 archon's 注释,移动操作失败,因为它在 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 方法,这会导致它关闭打开的文件。