Windows 重命名多个进程尝试使用的文件

Windows 重命名多个进程尝试使用的文件,windows,file-io,concurrency,java-5,Windows,File Io,Concurrency,Java 5,我有两个并行运行的应用程序,它们都执行以下操作: 检查不包含“已处理”的文件 处理该文件,然后将其重命名为filename+processed 对于每个文件,只能有一个应用程序使用它(先到先得) 我获取文件并锁定它们,以便其他应用程序无法处理它。但是当涉及到重命名文件时,我遇到了一个问题。要重命名该文件,需要使用file.renameTo函数。但是,要使其工作,我必须释放文件上的锁。但当我释放锁时,另一个进程可能会尝试使用该文件。这完全不应该发生 在应用程序A释放锁和完成重命名文件之间,是否

我有两个并行运行的应用程序,它们都执行以下操作:

  • 检查不包含“已处理”的文件
  • 处理该文件,然后将其重命名为filename+processed
  • 对于每个文件,只能有一个应用程序使用它(先到先得)
我获取文件并锁定它们,以便其他应用程序无法处理它。但是当涉及到重命名文件时,我遇到了一个问题。要重命名该文件,需要使用file.renameTo函数。但是,要使其工作,我必须释放文件上的锁。但当我释放锁时,另一个进程可能会尝试使用该文件。这完全不应该发生

在应用程序A释放锁和完成重命名文件之间,是否有任何方法阻止应用程序B使用该文件

编辑

更多信息:

  • 如果文件不存在,则必须阻止创建文件
  • 该文件将被处理为随机访问文件(具有读写权限;如果该文件不存在,将创建一个新文件)

注意:在linux上,可以重命名已锁定的文件,因此不会出现此问题。但是,在Windows上,无法重命名锁定的文件;我必须释放锁,然后重命名它。但是,在释放锁的时间内,其他应用程序可以看到该文件可用,然后尝试使用它。

Windows应用程序可以使用该函数执行此操作,该函数允许您使用已打开的句柄重命名该文件。您可能无法从Java本机执行此操作


但是,一个更简单的解决方案是在开始处理文件之前将其重命名(例如,重命名为
filename+processing
)。如果应用程序A选择一个文件并将其重命名为文件名+处理,且第二个应用程序同时选择同一文件并尝试重命名,则以这种方式成功重命名文件的进程将负责处理该文件并最终将其重命名为
filename+processed

,其中一个将创建一个新的空文件。那我该怎么防止呢?重命名操作不可能创建新文件。如何进行重命名?重命名不是,但重命名需要一个文件对象。由于我需要读写权限,如果文件不再存在(如果第二个应用程序同时重命名了它),那么这将创建该文件。根据文档,创建文件对象不会导致创建新文件。请参阅并特别注意“此类的实例可能表示也可能不表示实际的文件系统对象,例如文件或目录。”实际上,我使用RandomAccessFile进行处理。很抱歉给你带来了困惑。