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

本文关键字:访问 文件 异常 进程 | 更新日期: 2023-09-27 18:07:19

我得到一个异常:进程无法访问文件。

代码如下:

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>");
    }
}             

哪里出错了?

EDIT: Error I'm get

The process failed: System.IO.IOException: The process cannot access The file 'z .

The process failed:'TF_B1BBA.xml',因为它正在被其他进程使用。在System.IO.__Error。WinIOError(Int32 errorCode, String maybeFullPath)在System.IO.FileStream。Init(字符串路径,FileMode模式,FileAccess访问,Int32 rights, Boolean useRights, FileShare share, Int32 bufferSize, FileOptionsSECURITY_ATTRIBUTES secAttrs, String msgPath, Boolean bFromProxy, Boolean useLongPath)在System.IO.FileStream . .字符串路径,FileMode模式,FileAccess访问;文件共享,Int32 bufferSize)在System.Xml.XmlDownloadManager。GetStream(Uri Uri, iccredential凭证)IWebProxy proxy, RequestCachePolicy cachePolicy在System.Xml.XmlUrlResolver。gettenentity (Uri绝对Uri,字符串角色,o类型)bjectToReturn)在System.Xml.XmlTextReaderImpl。xmlResolver OpenUrlDelegate(对象)在System.Threading.CompressedStack.runTryCode(对象userData)在System.Runtime.CompilerServices.RuntimeHelpers.ExecuteCodeWithGuaranteedCl对象userData(对象userData)在System.Threading.CompressedStack。运行(CompressedStack) CompressedStack, ContextCallback(对象状态)在System.Xml.XmlTextReaderImpl.OpenUrl ()在System.Xml.XmlTextReaderImpl.Read ()。在System.Xml.XmlLoader。加载(XmlDocument文档,XmlReader阅读器,布尔格式)veWhitespace)在System.Xml.XmlDocument。XmlReader负载(读者)在System.Xml.XmlDocument。负载(String文件名)在GSelInterface.Program。转换(对象源,文件系统事件参数f)在C:'文档和设置'Administrator'Desktop'ConsoleApplication1'ConsoleApplication1 ' Program.cs: 178行

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

在try块中您已经打开了文件。你需要关闭它。

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

按照这个例子。

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

这可能是因为监视程序(然后是FileShare。读写是重要的部分)。

试题:

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

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

编辑1:

似乎锁是由保存文件的进程设置的。当convert()被触发时,文件系统还没有完成保存文件的工作。如果你有一个很大的xml文件,这种情况尤其会发生。如果在写文件之前添加一个sleep,则不会引发异常。

这是一个快速&dirty补丁。

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

编辑2:

尝试在做事情之前删除观察者的事件,并在所有事情完成后再次添加,这样可以防止多个事件被触发。不确定EnableRaisingEvents = false是否能以正确的方式工作。请参阅这篇文章

EnableRaisingEvents(启用和禁用)

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());
}

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

xml处理异常

这是我提出的另一个问题。谢谢大家花时间帮助我。

确认该文件不存在

我必须重新创建我的构建配置,而旧文件仍然存在。一旦我删除了旧的转换,我就可以重新创建新的转换了。