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

C# 如何防止多个应用程序打开同一文件,c#,file-upload,file-locking,C#,File Upload,File Locking,我有一个windows服务将文件上传到不同的ftp站点 为了加快上传速度,在3台机器上安装了此服务。然后问题就出现了,因为3个服务都在同一个位置查找文件,有时它们只是拾取同一个文件,然后抛出异常 如何避免这种情况?由.net4.5设计的服务采用异步方法,因此如果应用文件锁,性能是否会变慢?我是这样想的, 获取目录中的所有文件名 然后锁定此集合 以某种方式确保每个服务获得不同的子集合,例如,总共30个文件,然后每个服务获得10个 但我不知道怎么做 您可以打开该文件进行独占读取,如果失败,则表示当前

我有一个windows服务将文件上传到不同的ftp站点

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

如何避免这种情况?由
.net4.5
设计的服务采用
异步
方法,因此如果应用文件锁,性能是否会变慢?我是这样想的,

  • 获取目录中的所有文件名
  • 然后锁定此集合
  • 以某种方式确保每个服务获得不同的子集合,例如,总共30个文件,然后每个服务获得10个
    但我不知道怎么做

    您可以打开该文件进行独占读取,如果失败,则表示当前有其他服务正在处理该文件,然后移动到下一个文件

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

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

    您将拥有一个带有单个记录的表,您的服务将在事务中调用它
    updatetablet1set t1.f1=t1.f1
    。这将阻止其他服务继续进行

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

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

    您可以读取文件而不锁定它。这些过程如何知道需要发送文件?您需要一名交通警察,一个决定哪些车辆通过交叉口的单一实体。分配作业的第四台机器。这种机器最常见的名称是“服务器”。文件是文本和图像,一旦上传,就会从IO中删除,所以我不想涉及数据库。我们将调查MSMQ。ThanksI的意思是数据库只是作为跟踪的手段,而不是将文件加载到数据库中。基本上,这是一个很好的观点。这可以在目录级别完成吗?例如,一个名为“AllOrders”的文件夹,它包含许多子目录order1、order2。。。等,每个子文件夹将包含文本和图像,基本上我想锁定应用于订单目录级别,然后不管有多少服务,每个服务将只拿起它自己的订单,并上传此订单的所有文件。将尝试像这样Foreach(var dir in AllOrders){lock(dir){…}这不起作用,无法判断另一台计算机是否已处理该文件并再次关闭该文件。好的,一个糟糕但有效的解决方案是,一旦服务获得一个文件夹,首先检查文件“tmp.txt”是否存在,如果存在,跳过此文件夹中的上载文件,如果不存在,创建一个名为“tmp.txt”的文件,然后继续。因为创建文件是排除,所以每个服务将在不同的文件夹上工作。