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

时间:2014-03-01 00:02:07

标签: windows file-io concurrency java-5

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

  • 检查不包含“已处理”的文件
  • 处理文件,然后将其重命名为filename + processed
  • 对于每个文件,只有一个应用程序应使用它(先到先得)

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

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

修改

更多信息:

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

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

1 个答案:

答案 0 :(得分:1)

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

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