如何防止多个应用程序打开同一个文件

时间:2013-09-17 21:05:11

标签: c# file-upload file-locking

我有一个Windows服务可以将文件上传到不同的ftp站点。

为了加快上传速度,此服务安装在3台机器上。然后出现问题,因为3个服务都查找相同的位置来获取文件,有时他们只是选择相同的文件然后抛出异常。

如何避免这种情况?由.net 4.5使用async方法设计的服务,因此如果应用了文件锁定,性能会变慢吗?我这样想,

  1. 获取目录中的所有文件名
  2. 然后锁定此集合
  3. 以某种方式确保每个服务获得不同的子集合,例如,总共30个文件,然后每个服务获得10个。
  4. 但不知道如何。

2 个答案:

答案 0 :(得分:2)

您可以打开文件进行独占读取,如果失败,则意味着另一个服务当前处理它,然后移动到下一个文件。

File.Open("test.txt", FileMode.Open, FileAccess.Read, FileShare.None);

答案 1 :(得分:0)

您可以创建一个队列。它可以是MSMQ或其他服务,它将使用文件名加载db Table。您的其他服务可以使用一些锁定表。

您将拥有一张包含单条记录的表格,您的服务会在交易中调用update table t1 set t1.f1=t1.f1。这将阻止其他服务继续。

在另一个表中,您有文件列表和标记(如果已经采用)。

考虑一个服务只读取这些文件并加载文件名表。 3个其他服务 - 端点,将锁定锁表记录,然后继续读取n文件名并将其标记为已采用。加载文件后,可以删除文件名。 如果服务在已删除和已删除之间失败:在下一个进程开始时,请检查时间戳。如果采取了文件,比如昨天,记录仍然存在,可能需要再次处理。

相关问题