. net 3.5中最好的文件互斥

本文关键字:文件 net | 更新日期: 2023-09-27 18:13:08

我想在文件上使用一些互斥锁,这样在其他进程停止使用某些文件之前,任何进程都不会接触它们。我如何在。net 3.5中做到这一点?下面是一些细节:

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

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

但是我很担心,因为可能会有这种情况,当我的复制过程将文件复制到某个文件夹时,在同一时间(在同一毫秒内)我的服务将检查是否有一些文件,并将对它们进行处理(但不是对所有文件进行处理,因为它在复制期间进行了检查)。

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

我怎样才能以可能简单的方式实现这样的事情?

谢谢你的帮助

. net 3.5中最好的文件互斥

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

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

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

你的问题其实不在于互斥,而在于原子性。复制多个文件不是原子操作,因此可能会观察到文件处于半复制状态,这是您想要防止的。

要解决这个问题,可以将整个操作集中在单个原子文件系统操作上,例如重命名(或移动)文件夹。这样就没有人能观察到中间态。你可以这样做:

  1. 将文件复制到监视文件夹之外的文件夹,但在同一驱动器上。
  2. 复制操作完成后,将文件夹移动到被监视的文件夹中。对于任何外部进程,所有的文件都会同时出现,它没有机会只看到部分文件。