将文件保存在独立存储中

时间:2015-10-02 16:04:43

标签: c# save isolatedstorage isolatedstoragefile

我正在为一堂课做一份成绩单课程;细节不是那么重要,除了知道我需要能够保存文件并在以后调用它。我知道如何序列化,反序列化等等,一切都很好。但是当我试图保存时问题出现了。我对整个保存数据场景有点新意,我并不完全了解这些技术,但我觉得它应该可以工作 - 除了我每次尝试它都会产生错误。

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,并显示消息“Operation not allowed”。我看了一遍,我已经研究过MSDN,我已经搜遍了所有可以的地方,但我无法弄清楚问题是什么。这可能只是我忽略的东西,但我在这里撕扯我的头发,我可以使用一些帮助。感谢。

1 个答案:

答案 0 :(得分:0)

要扩展archon's注释,移动操作会失败,因为它位于using块内。如下更改代码可以解决问题。

Temp.utc

为什么失败的原因是使用块打开了文件Dispose,并且无法移动打开的文件。一旦执行离开using块,isoStream方法就会在using System; using System.Drawing; using System.Net; using System.Net.Sockets; using System.Text; using System.Windows.Forms; using System.IO; using System.Collections.Generic; class Client:Form { public Client() { Size = new Size(400, 380); Button connect = new Button(); connect.Parent = this; connect.Text = "Connect"; connect.Location = new Point(295, 20); connect.Size = new Size(6 * Font.Height, 2 * Font.Height); connect.Click += new EventHandler(ButtonConnectOnClick); Button browse = new Button(); browse.Parent = this; browse.Text = "Browse"; browse.Location = new Point(220, 20); browse.Size = new Size(6 * Font.Height, 2 * Font.Height); browse.Click += new EventHandler(ButtonbrowseOnClick); } void ButtonConnectOnClick(object obj, EventArgs ea) { tcpClient = new TcpClient("127.0.0.1", 1234); } [STAThread] public static void Main() { Application.Run(new Client()); } } 上调用,这会导致它关闭打开的文件。