我需要编写自定义批处理文件重命名器。我已经完成了大部分工作,除了我无法弄清楚如何检查文件是否已经打开。我只是使用java.io.File
包并且有一个canWrite()
方法,但似乎没有测试该文件是否被其他程序使用。关于如何使这项工作的任何想法?
答案 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
或其他内容,您仍然遇到可能出现问题的问题,并在您测试文件和重命名之间打开文件。更简单但不可移植的解决方案是尝试重命名(或者您正在尝试做的任何事情)并诊断返回值和/或由于打开的文件而产生的任何Java异常。
注意:
如果您使用Files
API代替File
API,则会在发生故障时获得更多信息。
在允许您重命名已锁定或打开文件的系统(例如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,其中“进程无法访问该文件,因为它正被异常消息中的另一个进程使用”。