c#FileSystemWatcher在多个客户端上触发

时间:2015-04-14 12:59:42

标签: c# filesystemwatcher

我正在使用FileSystemWatcher来查看目录。我创建了一个_Created()事件处理程序,以便在文件移动到此文件夹时触发。我的问题如下:

当用户点击“真实按钮”(我们库存中的按钮,而不是应用程序中的按钮)时,将创建此目录中的文件。 FileSystemWatcher获取此文件,在系统中执行一些操作然后将其删除。当应用程序只运行一次时,这不会是一个问题。但它被6个客户使用。因此,每个客户端上的每个应用程序都试图删除它。如果一个客户端太慢,它将抛出异常,因为该文件已被删除。

我要求的是:有没有办法避免这种情况?

我尝试使用循环并检查文件是否仍然存在,但没有任何成功。

while (File.Exists(file))
{
    File.Delete(file);
    Thread.Sleep(100);
}

有人能给我一个暗示它可能起作用吗?

2 个答案:

答案 0 :(得分:3)

<强>设计

如果您希望仅由单个实例处理文件(例如,响应的第一个实例获取作业),那么您应该实现锁定机制。只有能够获取文件锁定的实例才能处理并删除它,所有其他实例都应该跳过该文件。

如果您对处理文件的所有实例都很好,并且只关心其中至少有一个成功,那么您需要确定哪些异常表示真正的失败,哪些异常表示另一个异常实例

<强>锁定

要“锁定”文件,您可以使用共享模式FileShare.None打开它。这可以防止其他进程在您关闭文件之前打开它。但是,您需要在删除之前关闭该文件,这会留下一个小间隙,在此期间另一个实例可以打开该文件。

更好的解决方案是为此目的创建一个单独的锁文件。使用文件模式FileMode.Create和共享模式FileShare.None创建它并保持打开状态,直到整个过程完成,包括删除已处理的文件。然后可以关闭锁定文件并可选择将其删除。

<强>异常

至于UnauthorizedAccessException,根据documentation,这意味着四件事之一:

  1. 您没有所需的权限
  2. 该文件是正在使用的可执行文件
  3. 路径是目录
  4. 该文件为只读
  5. 在这种情况下,

    1和4似乎最有可能(如果文件在另一个进程中打开,则会得到IOException)。

答案 1 :(得分:0)

如果要在同一台计算机上同步多个客户端之间的访问权限,则应使用Named Mutex