该进程无法访问文件'filename.xml',因为它正由另一个进程使用

时间:2013-03-14 14:18:44

标签: c# asp.net xml

我有一个web服务项目c#,当我上传我的项目@live时,我收到此错误:

  

System.IO.IOException:进程无法访问该文件   'E:\网站\ www.bivolino.com \ bivolino3D \ bivo \ imgGal \ ProductFeedBeslist.xml'   因为它正被另一个进程使用。在   System.IO .__ Error.WinIOError(Int32 errorCode,String maybeFullPath)
  在System.IO.FileStream.Init(字符串路径,FileMode模式,FileAccess   访问,Int32权限,布尔useRights,FileShare共享,Int32   bufferSize,FileOptions选项,SECURITY_ATTRIBUTES secAttrs,String   System.IO.FileStream..ctor中的msgPath,Boolean bFromProxy(String   路径,FileMode模式,FileAccess访问,FileShare共享)at   System.Xml.XmlTextWriter..ctor(String filename,Encoding encoding)
  在ws_og_bivolinogallery.GetItemsBeslist()中   E:\网站\ www.bivolino.com \ bivolino3D \ bivo \ OpenGarments \ og_webservice \ App_Code文件\ ws_og_bivolinogallery.cs:线   1186

在我的本地(本地服务器)中,当我运行我的项目时,一切正常,但@live(实时服务器)我的所有方法都不再工作了。 这是我的代码(例如我的新方法):

[WebMethod(MessageName = "GetItemsBeslist", Description = "Get a list of GAL shirts", CacheDuration = 3600)]
   public XmlDocument GetItemsBeslist()
   {
   XmlTextWriter textWriter = new XmlTextWriter("E:/Sites/www.bivolino.com/bivolino3D/bivo/imgGal/ProductFeedBeslist.xml", Encoding.UTF8);
   //E:/Sites/www.bivolino.com/bivolino3D/bivo/imgGal
   try
   {
       if (bRegisterIP)
       {
           try { LogFiler.ToLog("### IP ### - [" + sRemoteAddress + "]"); }
           catch { }
       }
       XmlDocument xProducts = new XmlDocument();
       XmlElement subElm;
       XmlElement elmAttr;
       XmlNode elmValue;


       xProducts.CreateXmlDeclaration("1.0", "utf-8", null);
       XmlElement topElm = xProducts.CreateElement("ProductFeed");
       topElm.SetAttribute("version", "1.0");
       topElm.SetAttribute("timestamp", System.DateTime.Now.ToString().Replace(" ", ":"));
       xProducts.AppendChild(topElm);

       List<string[]> strarrVelden = new List<string[]>();
       strarrVelden.AddRange(DB.GetItemsBeslist());
       foreach (string[] rij in strarrVelden)
       {

           subElm = xProducts.CreateElement("Product");

           elmAttr = xProducts.CreateElement("ProductTitle");
           elmValue = xProducts.CreateNode(XmlNodeType.Text, "ProductTitle", null); elmValue.Value = "Herenoverhemd Bivolino " + rij[5].ToString();
           elmAttr.AppendChild(elmValue);
           subElm.AppendChild(elmAttr);

           elmAttr = xProducts.CreateElement("Price");
           elmValue = xProducts.CreateNode(XmlNodeType.Text, "Price", null); elmValue.Value = rij[6].ToString().Replace(",", ".");
           elmAttr.AppendChild(elmValue);
           subElm.AppendChild(elmAttr);


           elmAttr = xProducts.CreateElement("productURL");
           elmValue = xProducts.CreateNode(XmlNodeType.CDATA, "productURL", null); elmValue.Value = rij[1].ToString();
           elmAttr.AppendChild(elmValue);
           subElm.AppendChild(elmAttr);


           elmAttr = xProducts.CreateElement("Category");
           elmValue = xProducts.CreateNode(XmlNodeType.Text, "Category", null); elmValue.Value = "Herenoverhemd ";
           elmAttr.AppendChild(elmValue);
           subElm.AppendChild(elmAttr);


           elmAttr = xProducts.CreateElement("ProductDescription");
           elmValue = xProducts.CreateNode(XmlNodeType.Text, "ProductDescription", null); elmValue.Value = rij[2].ToString();
           elmAttr.AppendChild(elmValue);
           subElm.AppendChild(elmAttr);



           topElm.AppendChild(subElm);
       }

       textWriter.WriteStartDocument();

       xProducts.Save(textWriter);
       textWriter.WriteEndDocument();
       textWriter.Close();

       return xProducts;


   }
   catch (Exception ex)
   {
       return ErrHandle("ERROR - GetItemsBeslist - " + ex.Message, "ERROR - GetItemsBeslist");
   }

}

通常这些错误来自未关闭的文件流,但我已经处理过了。我想我已经忘记了一个重要的步骤,但无法弄清楚在哪里。非常感谢你的帮助

5 个答案:

答案 0 :(得分:1)

我只在方法结束时(当我们真正需要它时)创建XmlTextWriter并且我也使用了一个使用块。 using (var textWriter = new XmlTextWriter ("")) { ... } 而且,这个方法可以同时被不同的线程调用吗?如果是这样,你必须处理并发。

答案 1 :(得分:0)

尝试将你的流ctor包装在`using:

using (XmlTextWriter textWriter = new XmlTextWriter("E:/Sites/www.bivolino.com/bivolino3D/bivo/imgGal/ProductFeedBeslist.xml", Encoding.UTF8)){

...
}

您的代码似乎不会在异常时关闭流,using负责处理。即使XmlTextWriter是IDisposable,它可能需要一些时间才能处理掉,你可能会在发生这种情况之前使用你的方法。

另外 - 了解序列化,很可能不需要像你那样手动创建XML。

答案 2 :(得分:0)

考虑使用Server.MapPathHostingEnvironment来获取文件系统链接。使用声明应该处理这个问题。

[WebMethod(MessageName = "GetItemsBeslist", Description = "Get a list of GAL shirts", CacheDuration = 3600)]
public XmlDocument GetItemsBeslist()
{
    if (bRegisterIP)
    {
       try { LogFiler.ToLog("### IP ### - [" + sRemoteAddress + "]"); }
       catch { }
    }

    try
    {
       var xProducts = GetProducts();
       string file = Server.MapPath("/bivolino3D/bivo/imgGal/ProductFeedBeslist.xml");

       using(XmlTextWriter textWriter = new XmlTextWriter(file, Encoding.UTF8))
       {
           textWriter.WriteStartDocument();
           xProducts.Save(textWriter);
           textWriter.WriteEndDocument();
       }

       return xProducts;
    }
    catch (Exception ex)
    {
       return ErrHandle("ERROR - GetItemsBeslist - " + ex.Message, "ERROR - GetItemsBeslist");
    }
}

private XmlDocument GetProducts()
{
    XmlDocument xProducts = new XmlDocument();
    XmlElement subElm;
    XmlElement elmAttr;
    XmlNode elmValue;


    xProducts.CreateXmlDeclaration("1.0", "utf-8", null);
    XmlElement topElm = xProducts.CreateElement("ProductFeed");
    topElm.SetAttribute("version", "1.0");
    topElm.SetAttribute("timestamp", System.DateTime.Now.ToString().Replace(" ", ":"));
    xProducts.AppendChild(topElm);

    List<string[]> strarrVelden = new List<string[]>();
    strarrVelden.AddRange(DB.GetItemsBeslist());
    foreach (string[] rij in strarrVelden)
    {

       subElm = xProducts.CreateElement("Product");

       elmAttr = xProducts.CreateElement("ProductTitle");
       elmValue = xProducts.CreateNode(XmlNodeType.Text, "ProductTitle", null); elmValue.Value = "Herenoverhemd Bivolino " + rij[5].ToString();
       elmAttr.AppendChild(elmValue);
       subElm.AppendChild(elmAttr);

       elmAttr = xProducts.CreateElement("Price");
       elmValue = xProducts.CreateNode(XmlNodeType.Text, "Price", null); elmValue.Value = rij[6].ToString().Replace(",", ".");
       elmAttr.AppendChild(elmValue);
       subElm.AppendChild(elmAttr);


       elmAttr = xProducts.CreateElement("productURL");
       elmValue = xProducts.CreateNode(XmlNodeType.CDATA, "productURL", null); elmValue.Value = rij[1].ToString();
       elmAttr.AppendChild(elmValue);
       subElm.AppendChild(elmAttr);


       elmAttr = xProducts.CreateElement("Category");
       elmValue = xProducts.CreateNode(XmlNodeType.Text, "Category", null); elmValue.Value = "Herenoverhemd ";
       elmAttr.AppendChild(elmValue);
       subElm.AppendChild(elmAttr);


       elmAttr = xProducts.CreateElement("ProductDescription");
       elmValue = xProducts.CreateNode(XmlNodeType.Text, "ProductDescription", null); elmValue.Value = rij[2].ToString();
       elmAttr.AppendChild(elmValue);
       subElm.AppendChild(elmAttr);



       topElm.AppendChild(subElm);
    }

    return xProducts;
}

答案 3 :(得分:0)

我还会在textWriter.Close()之前调用textWriter.Flush(),或者作为使用块的最后一行。有时.NET需要一段时间才能从缓冲区写入关闭时IO操作的基础流,这可能会锁定您的文件。

答案 4 :(得分:0)

你应该在真正需要时尝试打开文件并序列化多个线程的访问权限。

而不是在方法的开头打开文本编写器,在需要它的地方打开它,即在方法结束时还定义静态全局对象objLock,你可以在其上进行锁定。这应该工作

 private static  object objLock = new object();

 lock(objLock)
 {
   using (XmlTextWriter textWriter = new    XmlTextWriter("E:/Sites/www.bivolino.com/bivolino3D/bivo/imgGal/ProductFeedBeslist.xml", Encoding.UTF8))
    {
       textWriter.WriteStartDocument();
       xProducts.Save(textWriter);
       textWriter.WriteEndDocument();
       textWriter.Close();


     }

 }