我正在使用FileSystemWatcher
来查看目录。我创建了一个_Created()
事件处理程序,以便在文件移动到此文件夹时触发。我的问题如下:
当用户点击“真实按钮”(我们库存中的按钮,而不是应用程序中的按钮)时,将创建此目录中的文件。 FileSystemWatcher
获取此文件,在系统中执行一些操作然后将其删除。当应用程序只运行一次时,这不会是一个问题。但它被6个客户使用。因此,每个客户端上的每个应用程序都试图删除它。如果一个客户端太慢,它将抛出异常,因为该文件已被删除。
我要求的是:有没有办法避免这种情况?
我尝试使用循环并检查文件是否仍然存在,但没有任何成功。
while (File.Exists(file))
{
File.Delete(file);
Thread.Sleep(100);
}
有人能给我一个暗示它可能起作用吗?
答案 0 :(得分:3)
<强>设计强>
如果您希望仅由单个实例处理文件(例如,响应的第一个实例获取作业),那么您应该实现锁定机制。只有能够获取文件锁定的实例才能处理并删除它,所有其他实例都应该跳过该文件。
如果您对处理文件的所有实例都很好,并且只关心其中至少有一个成功,那么您需要确定哪些异常表示真正的失败,哪些异常表示另一个异常实例
<强>锁定强>
要“锁定”文件,您可以使用共享模式FileShare.None
打开它。这可以防止其他进程在您关闭文件之前打开它。但是,您需要在删除之前关闭该文件,这会留下一个小间隙,在此期间另一个实例可以打开该文件。
更好的解决方案是为此目的创建一个单独的锁文件。使用文件模式FileMode.Create
和共享模式FileShare.None
创建它并保持打开状态,直到整个过程完成,包括删除已处理的文件。然后可以关闭锁定文件并可选择将其删除。
<强>异常强>
至于UnauthorizedAccessException
,根据documentation,这意味着四件事之一:
1和4似乎最有可能(如果文件在另一个进程中打开,则会得到IOException
)。
答案 1 :(得分:0)
如果要在同一台计算机上同步多个客户端之间的访问权限,则应使用Named Mutex。