当前位置: 首页 > 知识库问答 >
问题:

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

上官凯歌
2023-03-14

我遇到了一个例外:进程无法访问该文件。

代码如下:

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

这里可能出了什么问题?

编辑:我得到的错误

进程失败:系统。IO。IOException:进程无法访问文件“z:\TF\u B1BBA”。因为它正被另一个进程使用。at系统。IO__错误系统中的WinIOError(Int32 errorCode,字符串maybeFullPath)。IO。文件流。系统初始化(字符串路径、文件模式模式、文件访问访问、I nt32权限、布尔用户权限、文件共享、Int32缓冲区大小、文件选项、安全属性secAttrs、字符串msgPath、布尔bFromProxy、Boolean useLongPath)。IO。文件流。。系统中的ctor(字符串路径、文件模式、文件访问访问、文件共享、Int32 bufferSize)。Xml。XmlDownloadManager。系统中的GetStream(Uri Uri、ICredentials凭据、IWebProxy代理、RequestCachePolicy cachePolicy)。Xml。XmlUrlResolver。系统中的GetEntity(Uri绝对Uri、字符串角色、对象返回的类型)。Xml。XmlTextReaderImpl。系统中的OpenUrlDelegate(对象xmlResolver)。穿线。压缩堆栈。在系统上运行trycode(对象用户数据)。运行时。编译器服务。运行时助手。在系统上执行ECodeWithGuaranteedCL eanup(TryCode代码、CleanupCode backoutCode、Object userData)。穿线。压缩堆栈。在系统上运行(CompressedStack CompressedStack,Cont extCallback callback,Object state)。Xml。XmlTextReaderImpl。系统中的OpenUrl()。Xml。XmlTextReaderImpl。读取()。at系统。Xml。XmlLoader。在系统中加载(XmlDocument doc、XmlReader reader、Boolean prese veWhitespace)。Xml。XML文档。在系统上加载(XmlReader reader)。Xml。XML文档。在GSelInterface加载(字符串文件名)。程序在C:\Documents and Settings\Administrator\Desktop\ConsoleApplication1\ConsoleApplication1\Program中转换(对象源、文件系统目标f)。cs:178号线

共有3个答案

丁学
2023-03-14

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

编辑1:

锁似乎是由保存文件的进程设置的。启动convert()时,文件系统仍未完成文件的保存。如果您有一个大的xml,这种情况尤其会发生。如果您在尝试写入文件之前添加睡眠,则不会引发异常。

这是一个快速

如果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());
}
元望
2023-03-14

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

尝试:

XmlDocument xdoc = new XmlDocument();
FileStream fs = new FileStream(FileName, FileMode.Open, FileAccess.Read, FileShare.ReadWrite);
xdoc.Load(fs);
漆雕彬彬
2023-03-14

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

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

遵循此示例。

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

 类似资料:
  • 我在ubuntu服务器上运行selenium测试用例,该服务器基本上在firefox和chrome中运行测试用例。Firefox启动并成功运行测试用例,但chrome引发异常: *****下面是stacktrace的片段:***** 在端口21549上启动ChromeDriver(v2.8.240825) 禁用PAC支持,因为没有系统实现 测试集成。AdminUserelementscheck失败

  • 我刚使用System.io,我不明白为什么我的代码会导致这个异常。我想检查一个目录和一个文件是否存在,如果不存在,我想创建它们。之后,我想在我刚创建的文件上写点东西。在这里它抛出异常。我非常确信,当im试图使用StreamWriter时,创建会导致异常,因为如果该文件已经存在,我不会得到一个执行。此外,当我在一次尝试失败后再次单击调用此funktion的按钮时,没有任何例外,并且一切都运行良好(看

  • 我正在尝试使用selenium(2.53.1)和pom作为浏览器启动Chrome(版本58.0.3029.110(64位)) 代码: 我在Eclipse控制台中得到以下异常 D: \eclipse\QA\u Code\u Git\u Gerrit\TA-PAY\api automation\lib\chromedriver。exe在端口38042上启动ChromeDriver 2.29.46159

  • 我有一个带有以下代码的p12文件上传功能: 然后我想创建一个函数来删除p12文件,代码如下: 当我运行结果时,出现了一个错误: 有没有办法成功删除文件? 更新:我发现了这个问题,显然是因为这个函数中使用了p12文件: 有没有办法删除p12文件?

  • 运行在wince 5.0/.NET framework compact 2.0上的代码 总是会得到一个异常: 另外:我只想更新文件,读写。还有更好的办法吗?

  • 进程无法访问文件“f:\copy backup\system\hrm 2-5-2013\hrm\hrm\lanbased.txt”,因为另一个进程正在使用该文件。这是我在sub main中的代码 这是我的表单CREATE中的代码。当另一个进程正在使用该文件时,我如何访问该文件?