检查文件是否已打开

2022-08-31 19:37:57

我需要编写一个自定义批处理文件重命名器。我已经完成了大部分工作,除了我不知道如何检查文件是否已经打开。我只是在使用软件包,并且有一种方法,但这似乎不能测试该文件是否正在被另一个程序使用。关于我如何做到这一点的任何想法?java.io.FilecanWrite()


答案 1

使用Apache Commons IO库...

boolean isFileUnlocked = false;
try {
    org.apache.commons.io.FileUtils.touch(yourFile);
    isFileUnlocked = true;
} catch (IOException e) {
    isFileUnlocked = false;
}

if(isFileUnlocked){
    // Do stuff you need to do with a file that is NOT locked.
} else {
    // Do stuff you need to do with a file that IS locked
}

答案 2

(问答是关于如何处理Windows“打开文件”的锁...而不是如何移植地实现这种锁定。

整个问题充满了可移植性问题和争用条件:

  • 您可以尝试使用FileLock,但您的操作系统和/或文件系统不一定支持它。
  • 在Windows上,如果另一个应用程序以特定方式打开了文件,则可能无法使用FileLock。
  • 即使您确实设法使用了其他东西,您仍然会遇到这样的问题,即在测试文件和执行重命名之间可能会遇到某些东西并打开文件。FileLock

一个更简单但不可移植的解决方案是尝试重命名(或者您正在尝试做的任何事情),并诊断由于打开的文件而引起的返回值和/或任何Java异常。

笔记:

  1. 如果使用 API 而不是 API,则在发生故障时将获得更多信息。FilesFile

  2. 在允许您重命名锁定或打开的文件的系统(例如Linux)上,您不会收到任何失败结果或异常。操作将成功。但是,在这样的系统上,您通常不需要担心文件是否已打开,因为操作系统不会在打开时锁定文件。