繁体   English   中英

作为过程启动后写入文件会导致UnauthorizedAccessException(拒绝访问路径XXX。)

[英]Write to a file after it is started as a process causes UnauthorizedAccessException (Access to the path XXX is denied.)

以下C#代码有时在“ File.WriteAllText(“ test_a.cmd”,“超时15”)“行中失败,任何人都知道为什么以及如何解决它? 谢谢。

        for (int i = 0; i < 100; i++)
        {
            File.WriteAllText("test_a.cmd", "rem timeout 1");
            var p = Process.Start("test_a.cmd");

            p.WaitForExit();
            p.Dispose();
            p = null;

            //GC.Collect();
            //GC.WaitForPendingFinalizers();

            File.Delete("test_a.cmd");

            // Somtetimes it causes System.UnauthorizedAccessException: Access to the path 'XXX\test_a.cmd' is denied.
            File.WriteAllText("test_a.cmd", "timeout 15");
        }

另一个过程是使用删除共享打开文件。 这将使您的File.Delete()调用成功。 但不包含后续的File.WriteAllText()。 因为删除后文件仍然存在。 在其他进程关闭其文件句柄之前,它不会消失。 当文件仍处于混乱状态时,任何尝试覆盖文件的尝试都将失败,并显示“拒绝访问”错误。

这是在多任务操作系统上运行程序的变幻莫测的程序,其中其他进程可能会对您操作的文件感兴趣。 在大多数Windows安装中,这样的过程始终是个不错的选择,请禁用防病毒程序以查看是否可以解决问题。

除了只睡一会儿然后再试一次,还有一种体面的方法可以最大程度地减少损失。 您可以重命名该文件,但发生此异常的几率会大大降低:

File.Delete("test_a.cmd.bak");
File.Move("test_a.cmd", "test_a.cmd.bak");
for (int attempt = 0; ; ++attempt) {
    try {
       File.WriteAllText("test_a.cmd", "timeout 15");
       break;
    }
    catch (System.UnauthorizedAccessException ex) {
       if (attempt > 10) throw;
       System.Threading.Thread.Sleep(1000);
    }
}
try {
    File.Delete("test_a.cmd.bak");
}
catch (Exception ex) {}

由于File.WriteAllText()创建/覆盖文件,因此不需要调用Delete。 实际上,这可能是导致您出现问题的原因。

因此,我的解决方案是:

  • 远程文件删除
  • 在最后的WriteAllText之前添加Thread.Sleep(100)

睡眠部分是允许Windows执行处理,而这基本上是导致您异常的原因。

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM