c#异常进程无法访问该文件

时间:2013-04-04 12:26:24

标签: c# .net ioexception

我收到异常:进程无法访问该文件。

以下是代码:

if (!Monitor.TryEnter(lockObject))
    return;
try
{
    watcher.EnableRaisingEvents = false;
    try
    {
        XmlDocument xdoc = new XmlDocument();
        xdoc.Load(FileName);
        xdoc = null;
    }
    catch (XmlException xe)
    {
        using (StreamWriter w = File.AppendText(FileName))
        {
            Console.WriteLine(xe);
            w.WriteLine("</test>");
            w.WriteLine("</testwrapper>");
        }
    }
    System.Threading.Thread.Sleep(2000);
    XPathDocument myXPathDoc = new XPathDocument(new StreamReader(FileName, System.Text.Encoding.GetEncoding("windows-1256")));
    XslCompiledTransform myXslTrans = new XslCompiledTransform();
    myXslTrans.Load("D:/GS/xsl/test.xsl");
    XmlTextWriter myWriter = new XmlTextWriter(destinationFile, null);
    myWriter.Formatting = Formatting.Indented;
    myWriter.Indentation = 4;
    myXslTrans.Transform(myXPathDoc, null, myWriter);
    myWriter.Close();
}
catch (Exception e)
{
    Console.WriteLine("The process failed: {0}", e.ToString());
}
finally
{
    Monitor.Exit(lockObject);
    watcher.EnableRaisingEvents = true;
    GC.Collect();
    GC.WaitForPendingFinalizers();
    GC.Collect();
}

在添加这些行之前,代码工作正常。这些主要用于测试xml文件是否没有我通常得到的结束标记(然后添加标记)。在我添加以下代码后,它开始给我这个例外。

try
{
    XmlDocument xdoc = new XmlDocument();
    xdoc.Load(FileName);
    xdoc = null;

}
catch (XmlException xe)
{
    using (StreamWriter w = File.AppendText(FileName))
    {
        Console.WriteLine(xe);
        w.WriteLine("</test>");
        w.WriteLine("</testwrapper>");
    }
}             

这里可能有什么问题?

编辑:错误我正在

  

进程失败:System.IO.IOException:进程无法访问文件'z   :\ TF_B1BBA.xml'因为它正由另一个进程使用。     在System.IO .__ Error.WinIOError(Int32 errorCode,String maybeFullPath)     在System.IO.FileStream.Init(字符串路径,FileMode模式,FileAccess访问,我   nt32 rights,布尔值useRights,FileShare共享,Int32 bufferSize,FileOptions o   ptions,SECURITY_ATTRIBUTES secAttrs,String msgPath,Boolean bFromProxy,Boolea   n useLongPath)     在System.IO.FileStream..ctor(字符串路径,FileMode模式,FileAccess访问,   FileShare共享,Int32 bufferSize)     在System.Xml.XmlDownloadManager.GetStream(Uri uri,ICredentials credentials,   IWebProxy代理,RequestCachePolicy cachePolicy)     在System.Xml.XmlUrlResolver.GetEntity(Uri absoluteUri,String role,Type ofO)   bjectToReturn)     在System.Xml.XmlTextReaderImpl.OpenUrlDelegate(Object xmlResolver)     在System.Threading.CompressedStack.runTryCode(Object userData)     在System.Runtime.CompilerServices.RuntimeHelpers.ExecuteCodeWithGuaranteedCl   eanup(TryCode代码,CleanupCode backoutCode,Object userData)     在System.Threading.CompressedStack.Run(CompressedStack compressedStack,Cont   extCallback回调,对象状态)     在System.Xml.XmlTextReaderImpl.OpenUrl()     在System.Xml.XmlTextReaderImpl.Read()   。在System.Xml.XmlLoader.Load(XmlDocument doc,XmlReader reader,Boolean prese)   veWhitespace)     在System.Xml.XmlDocument.Load(XmlReader阅读器)     在System.Xml.XmlDocument.Load(String filename)     在C:\的GSelInterface.Program.convert(Object source,FileSystemEventArgs f)中   Documents and Settings \ Administrator \ Desktop \ ConsoleApplication1 \ ConsoleApplicat   ion1 \ Program.cs:第178行

5 个答案:

答案 0 :(得分:4)

在您的try块中,您已打开该文件。你需要关闭它。

XmlDocument xdoc = new XmlDocument();
xdoc.Load(FileName);

请遵循此示例。

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

答案 1 :(得分:4)

可能是因为观察者(然后FileShare.ReadWrite是重要部分)。

尝试:

XmlDocument xdoc = new XmlDocument();
FileStream fs = new FileStream(FileName, FileMode.Open, FileAccess.Read, FileShare.ReadWrite);
xdoc.Load(fs);

答案 2 :(得分:0)

您正在尝试写入已在try块中打开的“Filename”文件。

编辑1:

似乎锁定是由保存文件的进程设置的。 当触发convert()时,文件系统仍未完成保存文件。 特别是如果你有一个大的xml,它会发生。 如果在尝试写入文件之前添加睡眠,则不会引发异常。

这是一个快速而又肮脏的补丁。

如果以高频率保存xml文件,则需要为更改的xml文件添加某种锁定。

编辑2:

尝试在执行操作之前删除观察者的事件,并在完成所有操作后再次添加,以防止触发多个事件。 不确定EnableRaisingEvents = false将以正确的方式工作。 另见这篇文章:

EnableRaisingEvents (enabling and disabling it)

try
{
    watcher.EnableRaisingEvents = false;
    //Edit2: Remove the watcher event
    watcher.Changed -= new FileSystemEventHandler(convert);

    try
    {
      XmlDocument xdoc = new XmlDocument();
      xdoc.Load(FileName);
    }
    catch (XmlException xe)
    {
      System.Threading.Thread.Sleep(1000);  //added this line
      using (StreamWriter w = File.AppendText(FileName))
      {
        Console.WriteLine(xe);
        w.WriteLine("</test>");
        w.WriteLine("</testwrapper>");
      }
    }
}

/*
   Here all xslt transform code
*/

    //Edit2: Add again the watcher event
    watcher.Changed += new FileSystemEventHandler(convert);
}
catch (Exception e)
{
   Console.WriteLine("The process failed: {0}", e.ToString());
}

答案 3 :(得分:0)

此问题的解决方案就在这个链接上:

Exception during xml processing

这是我提出的另一个问题。谢谢所有花时间帮助我的人。

答案 4 :(得分:0)

确保该文件不存在。

我不得不重新创建我的构建配置,旧文件仍然存在。删除旧转换后,我可以重新创建新转换。