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

我有2个应用程序并行运行,都执行以下操作:

  • 检查文件是否包含“已处理”
  • 处理该文件,然后将其重命名为文件名+处理
  • 对于每个文件,只有一个申请应该使用它(先到先得)

我得到的文件,我也locking它们,使其他应用程序无法处理它。 但是,当重命名文件时,我遇到了一个问题。 要重命名文件,想要使用File.renameTo函数。 但是,为了工作,我必须释放文件上的锁。 但是当我释放锁时,另一个进程可能会尝试使用该文件。 确切的说,这不应该发生。

有没有办法阻止应用程序B使用应用程序A之间的文件释放locking和完成重命名文件?

编辑

一些更多的信息:

  • 如果文件不存在,则必须防止文件创build。
  • 该文件将被处理RandomAccessFile(具有读写权限;如果该文件不存在,将创build一个新文件)。

注意:在Linux上,可以重命名被locking的文件,所以这个问题不会发生在那里。 但是,在Windows上,locking的文件不能被重命名; 我必须释放锁,然后重命名它。 但是,释放锁的时间会使其他应用程序看到文件可用,然后尝试使用它。

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

但是,更简单的解决方案是开始处理之前重命名文件(例如filename+processing )。 无论哪个进程以这种方式成功重命名文件是负责处理它,并最终将其重命名为filename+processed