0

我想在文件上使用一些互斥锁,所以在其他进程停止使用它们之前,任何进程都不会触及某些文件。我怎样才能在 .NET 3.5 中做到这一点?以下是一些细节:

我有一些服务,它会每隔一段时间检查某个文件夹中是否有任何文件/目录,如果有,则服务正在对其进行处理。

我的另一个进程负责将文件(和目录)移动到某个文件夹中,一切正常。

但是我很担心,因为可能会出现这样的情况,当我的复制过程将文件复制到某个文件夹并且在同一时间(在同一毫秒内)时,我的服务将检查是否有一些文件,并对它们做一些事情(但不是全部,因为它在复制过程中进行了检查)。

所以我的想法是在那里放一些互斥锁(也许一个额外的文件可以用作互斥锁?),所以在复制完成之前服务不会检查任何东西。

我怎样才能以简单的方式实现这样的目标?

谢谢你的帮助。

4

2 回答 2

2

实现此目的的规范方法是文件名:

  • 进程 A 将文件复制到例如“somefile.ext.noprocess”(这是非原子的)
  • 进程 B 忽略所有带有“.noprocess”后缀的文件
  • 进程 B 完成复制后,将文件重命名为“somefile.ext”
  • 下次进程 B 检查时,它会看到文件并开始处理。

如果您有多个文件,必须一起处理(或没有),则需要将此方案调整为包含事务文件名的附加事务文件:仅当此文件存在并且具有正确的名称时,必须进程 B 读取它并处理其中提到的文件。

于 2013-05-12T13:10:30.520 回答
0

你的问题真的不是互斥,而是原子性。复制多个文件不是原子操作,因此可以在您希望阻止的半复制状态下观察文件。

为了解决您的问题,您可以将整个操作依赖于单个原子文件系统操作,例如重命名(或移动)文件夹。这样,没有人可以观察到中间状态。你可以这样做:

  1. 将文件复制到受监视文件夹之外的文件夹,但位于同一驱动器上。
  2. 复制操作完成后,将文件夹移动到监控文件夹内。对于任何外部进程来说,所有文件都会一次出现,而且它没有机会只看到部分文件。
于 2013-05-12T13:22:34.510 回答