在文件启动后写入文件,因为进程会导致 UnauthorizedAccessException(对路径 XXX 的访问被拒
本文关键字:文件 路径 UnauthorizedAccessException XXX 访问 启动 进程 因为 | 更新日期: 2023-09-27 18:36:22
以下 C# 代码在"File.WriteAllText("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");
}
还有另一个进程使用删除共享打开文件。 这允许你的 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进行处理,这基本上是导致异常的原因。