检查文件是否已经打开
检查文件是否已经打开
我需要编写一个自定义的批量文件重命名器。我已经完成了绝大部分工作,只是不知道如何检查文件是否已经被打开。我只是使用了 java.io.File
包,并且有一个 canWrite()
方法,但似乎不能测试文件是否被另一程序使用。你有什么想法可以让这个工作吗?
admin 更改状态以发布 2023年5月21日
这个问答是关于如何处理Windows的“打开文件”锁定问题……而不是如何在不同平台上实现这种锁定。
这个问题涉及到可移植性问题和竞态条件:
- 你可以尝试使用
FileLock
,但并不一定支持你的操作系统和/或文件系统。 - 似乎在Windows上,如果另一个应用程序以特定的方式打开了文件,你可能无法使用
FileLock
。 - 即使你成功使用了
FileLock
或其他东西,你仍然面临一个问题,就是在你测试文件并重命名之间,有可能会有其他东西进来打开文件。
一个更简单但非可移植的解决方案是尝试重命名(或你正在尝试的任何其他操作),并诊断返回值和/或由于打开的文件而出现的任何Java异常。
注意:
-
如果你使用
Files
API而不是File
API,当出现失败情况时,你将获得更多的信息。 -
在允许重命名锁定或打开文件的系统(例如Linux)上,你将不会获得任何失败结果或异常。操作将成功进行。但是,在这种系统上,你通常不需要担心文件是否已经打开,因为操作系统不会在打开文件时锁定文件。
使用Apache Commons IO库...\n
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 }