我正在为一堂课做一份成绩单课程;细节不是那么重要,除了知道我需要能够保存文件并在以后调用它。我知道如何序列化,反序列化等等,一切都很好。但是当我试图保存时问题出现了。我对整个保存数据场景有点新意,我并不完全了解这些技术,但我觉得它应该可以工作 - 除了我每次尝试它都会产生错误。
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,我已经搜遍了所有可以的地方,但我无法弄清楚问题是什么。这可能只是我忽略的东西,但我在这里撕扯我的头发,我可以使用一些帮助。感谢。
答案 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());
}
}
上调用,这会导致它关闭打开的文件。