我在隔离存储中创建一个文件,然后访问相同的文件并在单击按钮时进行编辑。但有时会发生异常,并且详细说明隔离存储上不允许进行操作。这个例外在第一次单击按钮时有时会出现固定时间,有时候在第5次或第6次点击后会出现问题。单击按钮时会调用以下代码中的ISOFileProcess(String module,String operation,String xmlObj)函数。
public static void ISOFileProcess(String module, String operation, String xmlObj)
{
var store = IsolatedStorageFile.GetUserStoreForApplication();
if (store.FileExists(IsolatedMemFileHandlingCon.fileName) == false)
{
StreamWriter sw = new StreamWriter(store.OpenFile(IsolatedMemFileHandlingCon.fileName, FileMode.OpenOrCreate));
CreateXML(sw,module,operation,xmlObj);
sw.Close();
MessageBox.Show("File Created.");
}
else
{
//store.OpenFile(IsolatedMemFileHandlingCon.fileName, FileMode.Append);
IsolatedStorageFileStream isoStream =
new IsolatedStorageFileStream(IsolatedMemFileHandlingCon.fileName, FileMode.Append, FileAccess.ReadWrite, store);
EditXML(isoStream, module, operation, xmlObj);
isoStream.Close();
}
}
#endregion
#region XML Creation And Editing
private static void CreateXML(StreamWriter sw, String mname, String operation, String xmlObj)
{
XmlWriter xWrt = XmlWriter.Create(sw);
xWrt.WriteStartElement("ocs");
// xWrt.WriteStartElement("module");
xWrt.WriteStartElement("operation");
xWrt.WriteAttributeString("mode", operation);
xWrt.WriteAttributeString("mname", mname);
xWrt.WriteRaw(xmlObj);
xWrt.WriteEndElement();
//xWrt.WriteEndElement();
xWrt.WriteEndElement();
xWrt.Close();
}
private static void EditXML(IsolatedStorageFileStream sw, String mname, String operation, String xmlObj)
{
sw.Seek(sw.Length - 6, SeekOrigin.Begin);
XmlWriterSettings wrSettings = new XmlWriterSettings();
wrSettings.OmitXmlDeclaration = true;
XmlWriter xWrt = XmlWriter.Create(sw,wrSettings);
//xWrt.WriteStartElement("module");
xWrt.WriteStartElement("operation");
xWrt.WriteAttributeString("mode", operation);
xWrt.WriteAttributeString("mname", mname);
xWrt.WriteRaw(xmlObj);
xWrt.WriteEndElement();
//xWrt.WriteEndElement();
xWrt.WriteRaw("</ocs>");
xWrt.Close();
}
答案 0 :(得分:2)
您在此处指定FileMode.Append:
IsolatedStorageFileStream isoStream =
new IsolatedStorageFileStream(
IsolatedMemFileHandlingCon.fileName,
FileMode.Append,
FileAccess.ReadWrite, store);
Append不与FileAccess.ReadWrite结合,也不会在文件结束前移动光标。
在您使用随机访问的代码中,将光标移回:
sw.Seek(sw.Length - 6, SeekOrigin.Begin);
来自MSDN:
追加打开文件(如果存在)并寻找文件的末尾, 或创建一个新文件。 FileMode.Append只能结合使用 使用FileAccess.Write。试图在结束前寻找一个位置 该文件将抛出IOException并且任何读取尝试都将失败 并抛出NotSupportedException。