2013-04-22 107 views
0

我有一个web服务应用程序,它使用另一个应用程序来保存和加载一个xml文件。w3wp.exe(网络服务用户)阻止访问文件

对文件进行三次访问后,无法再次访问该文件。如果我终止属于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; 
    } 

任何想法是怎么回事,什么可以是这个

+0

通过“文件无法访问调用Stream.Flush()再一次“,你究竟是什么意思?拒绝访问?打开手柄?你有什么例外吗? – Basic 2013-04-22 19:25:28

+0

加载文件返回null,因为它已经被w3wp.exe打开 – user2307211 2013-04-22 19:42:41

回答

1

的解决方案似乎是一个竞争条件访问文件。您应该锁定文件进行写入,并允许其他人在阅读时对其进行修改。

要实现这一点,您还需要对FileStream类构造函数进行细粒度控制,指定每个案例的rig参数,以便在使用System.IO.FileShare枚举值读取时允许或不能修改文件。

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

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

我不知道这是否是完全必要或没有,但我也很喜欢之前关闭()

+1

Flush不仅是良好的行为,而且经常是必要的 - 许多类型的流不会写入最后一个块,除非它们在关闭之前被刷新,这可能会导致一些有趣的问题。 – Basic 2013-04-22 19:53:10