Warning: file_get_contents(/data/phpspider/zhask/data//catemap/9/java/336.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Java 锁定本地FS上的文件_Java_Concurrency_Filesystems - Fatal编程技术网

Java 锁定本地FS上的文件

Java 锁定本地FS上的文件,java,concurrency,filesystems,Java,Concurrency,Filesystems,我正在构建一个Java应用程序来处理本地FS(NTFS)上的文件,但是一个允许将来轻松扩展到Linux文件系统的解决方案会很好。问题是,如果我的应用程序的两个实例(进程)同时运行,那么一个文件不能被多次处理 似乎我需要在处理之前锁定每个文件。应用程序不使用数据库,仅为了锁定而使用数据库似乎并不方便 所以我想在文件名后面加一个后缀。问题是,如何(如果可能的话)询问文件名是否以后缀结尾,然后以原子方式追加后缀 我也很欣赏实现我所需要的其他技巧。您也许可以利用这样一个事实,即文件重命名操作在大多数文件

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

似乎我需要在处理之前锁定每个文件。应用程序不使用数据库,仅为了锁定而使用数据库似乎并不方便

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


我也很欣赏实现我所需要的其他技巧。

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

  • 获取每个文件的文件列表:
  • 尝试重命名该文件
  • 如果重命名成功-请处理该文件
  • 如果重命名失败-不处理该文件
  • 到2点了

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

  • 获取每个文件的文件列表:
  • 尝试重命名该文件
  • 如果重命名成功-请处理该文件
  • 如果重命名失败-不处理该文件
  • 到2点了

  • 你到那儿了吗?

    你到那儿了吗?

    像这样的方法应该行得通:

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

    像这样的方法应该会奏效:

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

    因为“测试并重命名”操作不是原子的,所以这真的会起作用还是会有竞争条件?因为“测试并重命名”操作不是原子的,所以这真的会起作用还是会有竞争条件?我想我会这样做。谢谢我想我会走这条路。谢谢为什么不以独占模式打开文件并使其保持打开状态(另一个实例届时将无法打开)?为什么不以独占模式打开文件并使其保持打开状态(另一个实例届时将无法打开)?