检查文件是否已打开

hel*_*ity 49 java file-io

我需要编写一个自定义批处理文件重命名器.我已经完成了大部分工作,除了我无法弄清楚如何检查文件是否已经打开.我只是使用该java.io.File包,并且有一个canWrite()方法,但似乎不测试该文件是否被另一个程序使用.关于如何使这项工作的任何想法?

小智 23

使用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
}
Run Code Online (Sandbox Code Playgroud)

  • 比赛状况警报! (18认同)
  • 这将更改文件的上次修改日期和时间。 (4认同)
  • 对于.xls文件,这不会引发任何形式的异常,只需碰一下就可以了。 (2认同)

Ste*_*n C 13

(Q&A是关于如何处理Windows"打开文件"锁...而不是如何实现这种可锁定的锁定.)

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

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

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

笔记:

  1. 如果您使用FilesAPI而不是FileAPI,则会在发生故障时获得更多信息.

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


Ahm*_*ail 9

    //  TO CHECK WHETHER A FILE IS OPENED 
    //  OR NOT (not for .txt files)

    //  the file we want to check
    String fileName = "C:\\Text.xlsx";
    File file = new File(fileName);

    // try to rename the file with the same name
    File sameFileName = new File(fileName);

    if(file.renameTo(sameFileName)){
        // if the file is renamed
        System.out.println("file is closed");    
    }else{
        // if the file didnt accept the renaming operation
        System.out.println("file is opened");
    }
Run Code Online (Sandbox Code Playgroud)

  • 不适用于Linux.在POSIX文件系统中,文件名不是主键,而是链接到文件内容.因此,您可以重命名或删除已打开的文件.没有人得到任何错误. (5认同)
  • 可以确认这适用于Windows10.似乎比挑起异常更优雅.使用ext4在linux上不起作用. (3认同)
  • 简直就是天才!+1. (2认同)

sid*_*ino 5

在Windows上我找到了答案/sf/answers/959488071/使用

fileIsLocked = !file.renameTo(file)

最有用,因为它在处理写保护(或只读)文件时避免了误报。


ska*_*man 1

我认为您永远不会为此获得明确的解决方案,操作系统不一定会告诉您文件是否打开。

java.nio.channels.FileLock尽管 javadoc 充满了警告,但您可能会从 中得到一些好处。