0

我有一个 Web 服务应用程序,它使用另一个保存和加载 xml 文件的应用程序。

对文件进行了 3 次访问后,无法再次访问该文件。如果我杀死属于 NETWORK SERVICE 用户的 w3wp.exe 进程,一切都会重新开始工作,但只有一次。

这是保存和加载 xml 文件的代码示例。

    public void saveXmlFile(string filename)
    {
        if (vsqlschema == null)
        {
            Console.WriteLine("Tried export data without schema");
            //TODO: Messagebox
            return;
        }
        FileStream fs = null;

        try
        {
            XmlSerializer serializer = new XmlSerializer(typeof(vsqlSchema));
            fs = new FileStream(filename, FileMode.Create, FileAccess.Write);
            serializer.Serialize(fs, vsqlschema);
        }
        catch (Exception e)
        {
            Console.WriteLine("IO Error: {0}", e.Message);
            //TODO: Messagebox
        }
        finally
        {
            if (fs != null)
            {
                fs.Close();
                fs.Dispose();
            }
        }
    }

    public XmlDocument loadXml(string filename)
    {
        //XmlReaderSettings xrs = new XmlReaderSettings();
        //xrs.XmlResolver = null;
        //xrs.DtdProcessing = DtdProcessing.Ignore;
        XmlDocument xdoc = new XmlDocument();
        try
        {
            //using (StringReader sr = new StringReader(filename))
            //using (XmlReader reader = XmlReader.Create(sr, xrs))
            using (XmlTextReader reader = new XmlTextReader(filename)){
                xdoc.Load(reader);  


                    reader.Close();

            }   

        }
        catch (XmlException xe)
        {
            errors.Add(string.Format("Line: {0}, Position: {1}::: {2}", xe.LineNumber, xe.LinePosition, xe.Message));
        }

        return xdoc;
    }

任何想法发生了什么以及可以解决这个问题的方法

4

1 回答 1

1

访问该文件似乎存在竞争条件。您应该锁定文件以进行写入,并允许其他人在读取时对其进行修改。

为了实现这一点,您还需要对 FileStream 类构造函数进行细粒度控制,为每种情况指定正确的参数,以允许或不允许在读取 System.IO.FileShare 枚举值时修改文件。

http://msdn.microsoft.com/en-us/library/cssfs8c4.aspx

http://msdn.microsoft.com/en-us/library/5h0z48dh.aspx

我不知道这是否完全有必要,但我也喜欢在 Close() 之前调用 Stream.Flush()

于 2013-04-22T19:32:45.850 回答