Warning: file_get_contents(/data/phpspider/zhask/data//catemap/2/csharp/272.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
C# 在文件启动后写入,因为进程会导致UnauthorizedAccessException(对路径XXX的访问被拒绝)_C#_.net - Fatal编程技术网

C# 在文件启动后写入,因为进程会导致UnauthorizedAccessException(对路径XXX的访问被拒绝)

C# 在文件启动后写入,因为进程会导致UnauthorizedAccessException(对路径XXX的访问被拒绝),c#,.net,C#,.net,下面的C#代码在“File.writealText(“test_a.cmd”,“timeout 15”)”行失败,有时,谁知道为什么以及如何解决呢?谢谢 for (int i = 0; i < 100; i++) { File.WriteAllText("test_a.cmd", "rem timeout 1"); var p = Process.Start("test_a.cmd");

下面的C#代码在“File.writealText(“test_a.cmd”,“timeout 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");
        }
for(int i=0;i<100;i++)
{
writealText(“test_a.cmd”,“rem timeout 1”);
var p=进程启动(“test_a.cmd”);
p、 WaitForExit();
p、 处置();
p=零;
//GC.Collect();
//GC.WaitForPendingFinalizers();
删除(“test_a.cmd”);
//有时会导致System.UnauthorizedAccessException:对路径“XXX\test\u a.cmd”的访问被拒绝。
writealText(“test_a.cmd”,“timeout 15”);
}
由于File.writealText()创建/覆盖文件,因此不需要调用Delete。事实上,这可能就是你的问题的原因

因此,我的解决方案是:

  • 远程文件。删除
  • 在最后一次写入之前添加Thread.Sleep(100)
睡眠部分是允许Windows进行处理,这是导致异常的根本原因。

还有一个进程使用删除共享打开文件。这允许您的File.Delete()调用成功。但不是后续文件。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.Delete是我的业务流程,File.writealText是实际代码中的另一个方法。此示例简化了此过程。如果删除File.Delete,则异常的发生频率会降低,但仍然会发生。睡眠可能是一种方式,但不是那么精确。你是对的,谢谢你的提醒。我从MSDN和process monitor中找到了确切的原因:DeleteFile函数在关闭时将文件标记为删除。因此,在关闭文件的最后一个句柄之前,不会删除文件。后续调用CreateFile以打开文件失败,错误为\u访问被拒绝。我必须做更多的工作来保证文件的书写。