我正在尝试使用C# File.Delete API删除windows上的文件。https://msdn.microsoft.com/en-us/library/system.io.file.delete(v=vs.110).aspx我正在断断续续地面对这个接口的UnauthorizedAccessException。实际上,多个进程/线程使用此文件作为此文件上的锁和File.Open。如果文件正在使用中,我希望从底层windows代码中抛出IOException,但有时我会看到UnauthorizedAccessException。这样做的过程是拥有适当的权限,它在大多数情况下都有效,但我随机地遇到了这个问题。
更多信息:我用作锁的文件的扩展名是.lck,并且总是为空。仅与File.Open接口一起用于锁定目的。文档指出,如果文件是正在使用的可执行文件,则也会抛出UnauthorizedAccessException。
问:有没有可能.lck被认为是可执行的,而UnauthorizedAccessException被抛出了?
如果正在使用文件,我希望使用IOException,那么导致UnauthorizedAccessException的其他原因是什么?
发布于 2017-11-13 12:22:47
在内部,File.Delete
函数调用Win32应用编程接口的DeleteFile函数。
文档中写道:
如果应用程序尝试删除不存在的文件,则DeleteFile函数将失败,并显示ERROR_FILE_NOT_FOUND。如果该文件是只读文件,则该函数将因ERROR_ACCESS_DENIED而失败。
以及以下内容:
DeleteFile函数用于在关闭时标记要删除的文件。因此,在关闭文件的最后一个句柄之前,不会发生文件删除。随后调用CreateFile打开该文件失败,并显示ERROR_ACCESS_DENIED。
然后,ERROR_ACCESS_DENIED
代码通向UnauthorizedAccessException
。
因此,文件上仍有至少一个写句柄处于活动状态。
一般来说,使用文件句柄来同步进程不是一个好主意。解决此问题的更好方法是使用命名EventWaitHandle
或命名Mutex
(有关更多信息,请参阅Synchronizing 2 processes using interprocess synchronizations objects - Mutex or AutoResetEvent )
例如,在Process1中执行
while (true)
{
using (var mutex = new Mutex(false, "THIS_IS_THE_UNIQUE_NAME_OF_THE_MUTEX"))
{
if (!mutex.WaitOne(0))
{
Console.WriteLine($"Process {Process.GetCurrentProcess().Id} waits");
mutex.WaitOne();
}
Console.Write($"Process {Process.GetCurrentProcess().Id} has entered protected area...");
Thread.Sleep(1000); // simulate work
Console.WriteLine("and is about to leave!");
mutex.ReleaseMutex();
}
}
在Process2中
using (var mutex = new Mutex(false, "THIS_IS_THE_UNIQUE_NAME_OF_THE_MUTEX"))
{
mutex.WaitOne();
Thread.Sleep(5000); // simulate work on different process
mutex.ReleaseMutex();
}
然后,Process1将一直等到Process2释放互斥锁,反之亦然。
https://stackoverflow.com/questions/47263631
复制相似问题