2012-02-07 65 views
1

我正在构建一个Java应用程序来处理本地FS上的文件(NTFS,但将来可以轻松扩展到Linux文件系统的解决方案会很好)。问题是,如果我的应用程序的两个实例(进程)同时运行,则单个文件不能被处理多次。锁定本地FS上的文件

好像我需要锁定每个文件,然后再处理它。该应用程序不使用数据库,仅用于锁定目的似乎并不方便。

所以我在考虑追加一个后缀到文件名。问题是,如何(如果有可能)询问文件名是否以后缀结尾,然后以原子方式追加后缀。

其他技巧,以实现我所需要的也是赞赏。

+0

为什么不以独占模式打开该文件,并把它打开(另一个实例只是将无法打开它,然后)? – 2012-02-07 19:03:26

回答

1

你也许可以利用文件重命名操作在大多数文件系统上是原子的事实。你的逻辑可能是这样的:

  1. 获取文件列表,每个文件:
  2. 尝试重命名文件
  3. 如果改名成功 - 工作,对文件
  4. 如果重命名失败 - 不该文件
  5. 有工作2
+0

我想我会走这条路。谢谢! – 2012-02-07 14:20:27

0

像这样的东西应该工作:

File someFile = new File(path); 
if (!someFile.getName().endsWith(".locked")) { 
    File lockedFile = new File(someFile.getAbsolutePath() + ".locked"); 
    someFile.renameTo(lockedFile); 
} 
+1

这会真的起作用吗?还是会有竞争条件,因为“测试和重命名”操作不是原子的? – 2012-02-07 14:02:59