2013-04-22 115 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