仅允许一台服务器访问网络驱动器上的文件

时间:2008-10-21 05:08:21

标签: c# file-io networking

我有一个应用程序在多个IIS服务器上运行,需要解析放在公共网络驱动器上的CSV文件。如果我在文件可用时使用System.IO.FileSystemWatcher Created event通知事件,我怎样才能确保只有一个服务器解析文件?如果所有服务器都收到此更改通知,则所有服务器都会尝试解析它。第一台服务器是否应该在本地复制,然后解析它?这会导致其他服务器出错吗?我应该将远程目录访问权限设置为仅允许一个服务器读取访问吗?

该文件包含需要插入共享数据库的记录,但记录没有唯一键。因此,如果多个服务器同时抓取文件并插入记录,则数据库中将存在重复项。

2 个答案:

答案 0 :(得分:2)

关键问题是:当所有人在大致同一时间尝试解析文件时,是否会发生错误?基本上允许在文件系统级别进行多次读取访问,因此仅此事实不一定会破坏任何内容。

我可能会尝试在第一次文件访问时创建锁文件的方法,并让服务器在访问文件之前查找锁文件。完成后删除锁定文件。

您还可以对文件进行独占锁定,一次只能有一台服务器执行此操作。其他人将尝试失败:

FileStream fs = new FileStream(
  FilePath, 
  FileMode.Open,
  FileAccess.ReadWrite, 
  FileShare.None
);

答案 1 :(得分:0)

另一个选项而不是锁定是将文件重命名为目录。为每个服务器创建一个子目录,然后让服务器尝试将文件重命名为其目录(重命名是一个原子操作)。成功的人可以解析文件。

锁定问题会很棘手,因为每个服务器仍然可以看到该文件,他们可能会尝试打开该文件,然后重复出错。重命名对于文件的所有者来说是绝对的。

还要记住您使用的任何解决方案都有可能出现“丢失文件”。如果服务器停止处理文件(错误,异常,重新启动......),它可能会被放弃。这些类型的问题的典型解决方案是除了文件监视器之类的东西,你有服务器轮流时不时。

将文件复制到服务器目录会对此有所帮助。一个缺点是如果服务器完全脱机,那么它的文件将位于dir中,直到服务器恢复联机。