检查文件是否已打开

时间:2009-09-07 18:53:36

标签: java file-io

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

8 个答案:

答案 0 :(得分: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
}

答案 1 :(得分:13)

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

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

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

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

注意:

  1. 如果您使用Files API代替File API,则会在发生故障时获得更多信息。

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

答案 2 :(得分:7)

    //  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");
    }

答案 3 :(得分:3)

在Windows上,我使用

找到了答案https://stackoverflow.com/a/13706972/3014879

fileIsLocked = !file.renameTo(file)

最有用,因为它可以避免在处理写保护文件时出现误报。

答案 4 :(得分:3)

.card { float: left; width: 32%; padding: 5px; margin: .5%; text-align: right; border-radius: 15px 50px; } .card:hover { -webkit-transition: width 2s, height 4s; /* Safari */ transition: width 2s, height 2s; background-color: #b9d6a0; color: black; } .card>img { margin-bottom: 12px; } .card-text { font-size: 85%; } .dashboardlink { width: 100%; height: auto; border-radius: 15px 50px; } doesn't check if your file is open or not. Instead, it changes the timestamp of the file to the current time.

I used IOException and it works just fine:

<div class="container">
  <div class="row">
    <div class="card">
      <a href="/ip" target="_blank">
        <img class="dashboardlink" src="/images/ip.png" alt="Immediate Pays">
      </a>
      <p class="card-text">Immediate Payments</p>
    </div>


    <div class="card">
      <a href="/ipmtd" target="_blank">
        <img class="dashboardlink" src="/images/ipmtd.png" alt="Immediate Pays - MTD">
      </a>
      <p class="card-text">Immediate Payments Month-To-Date</p>
    </div>


    <div class="card">
      <a href="/ivrPayments" target="_blank">
        <img class="dashboardlink" src="/images/ivrPayments.png" alt="IVR Payments">
      </a>
      <p class="card-text">IVR Payments</p>
    </div>


    <div class="card">
      <a href="/outboundHold" target="_blank">
        <img class="dashboardlink" src="/images/outboundHold.png" alt="Outbound Holds">
      </a>
      <p class="card-text">Outbounds Holds</p>
    </div>


    <div class="card">
      <a href="/poolPen" target="_blank">
        <img class="dashboardlink" src="/images/PoolPen.png" alt="Pool Penetration">
      </a>
      <p class="card-text">Pool Penetration</p>
    </div>


    <div class="card">
      <a href="/Tracker" target="_blank">
        <img class="dashboardlink" src="/images/Tracker.png" alt="Tracker">
      </a>
      <p class="card-text">Tracker Dashboard</p>
    </div>


    <div class="card">
      <a href="/userLookup" target="_blank">
        <img class="dashboardlink" src="/images/userLookup.png" alt="User Lookup">
      </a>
      <p class="card-text">SCSI User Lookup</p>
    </div>

    <div class="card">
      <a href="/inventory" target="_blank">
        <img class="dashboardlink" src="/images/inventory.png" alt="Inventory">
      </a>
      <p class="card-text">Inventory</p>
    </div>

  </div>
</div>

答案 5 :(得分:1)

我认为你不会得到一个明确的解决方案,操作系统不一定会告诉你文件是否打开。

你可能会从java.nio.channels.FileLock获得一些里程数,尽管javadoc会加载警告。

答案 6 :(得分:0)

嗨,我真的希望这会有所帮助。

我之前尝试过所有选项,但在Windows上都无法正常使用。帮助我完成此任务的唯一想法是尝试移动文件。事件到ATOMIC_MOVE下的同一地点。如果文件是由另一个程序或Java线程编写的,则肯定会产生异常。

 try{

      Files.move(Paths.get(currentFile.getPath()), 
               Paths.get(currentFile.getPath()), StandardCopyOption.ATOMIC_MOVE);

      // DO YOUR STUFF HERE SINCE IT IS NOT BEING WRITTEN BY ANOTHER PROGRAM

 } catch (Exception e){

      // DO NOT WRITE THEN SINCE THE FILE IS BEING WRITTEN BY ANOTHER PROGRAM

 }

答案 7 :(得分:-4)

如果文件正在使用中FileOutputStream fileOutputStream = new FileOutputStream(file);返回java.io.FileNotFoundException,其中“进程无法访问该文件,因为它正被异常消息中的另一个进程使用”。