隔离存储上不允许Silverlight 5操作

时间:2012-01-24 10:00:58

标签: silverlight isolatedstorage silverlight-5.0

我在隔离存储中创建一个文件,然后访问相同的文件并在单击按钮时进行编辑。但有时会发生异常,并且详细说明隔离存储上不允许进行操作。这个例外在第一次单击按钮时有时会出现固定时间,有时候在第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();

    }

1 个答案:

答案 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。