java中的文件锁定
Posted
技术标签:
【中文标题】java中的文件锁定【英文标题】:File Locking in java 【发布时间】:2019-01-15 13:12:26 【问题描述】:我有一个文件夹中的文件列表, 我想锁定一个特定文件(用户向我发送要锁定的文件的名称),我正在执行以下操作:
try
File file = new File("filename");
FileChannel channel = new RandomAccessFile(file, "rw").getChannel();
FileLock lock = channel.lock();
try
lock = channel.tryLock();
catch (OverlappingFileLockException e)
// File is already locked
catch (Exception e)
如果另一个用户想查看文件列表,我必须告诉他们文件的状态是锁定的,哪些是解锁的
File folder = new File("E:\\folder_to_LIST_OF_FILES");
File[] listOfFiles = folder.listFiles();
for (int i = 0; i < listOfFiles.length; i++)
if (listOfFiles[i].isFile())
FilesDto returnDto = new FilesDto();
returnDto.setFileName(FilenameUtils.removeExtension(listOfFiles[i].getName()));
// Check File Status if file is Locked or unlocked
if (lock==null)
returnDto.setStatus("unlocked");
returnDto.setFilePath(listOfFiles[i].getAbsolutePath());
else
returnDto.setStatus("Locked");
returnDtoList.add(returnDto);
这两个 sn-ps 来自不同的 API。 如何查看文件被锁定或解锁的状态?
【问题讨论】:
我记得有一个函数File.canWrite()
,也许它可以帮助
@SapuSeven 已经尝试过了。不工作。它总是返回 TRUE
但是您面临的问题是什么?
是的。 File.canWrite()
不相关。它正在检查权限,而不是(任意)锁定。
@Sidharth - 您的代码中存在潜在缺陷。当FileChannel
关闭(或您的应用程序退出)时,锁将被释放。在第一个代码 sn-p 中,FileChannel
可以在 channel
超出范围后随时关闭。
【参考方案1】:
FileLock 类上的documentation 说:
此文件锁定 API 旨在直接映射到底层操作系统的本机锁定设施。因此,文件上持有的锁应该对所有有权访问该文件的程序可见,而不管这些程序是用什么语言编写的。
看来您可以使用与第一个 sn-p 中相同的代码:
File folder = new File("E:\\folder_to_LIST_OF_FILES");
File[] listOfFiles = folder.listFiles();
for (int i = 0; i < listOfFiles.length; i++)
if (listOfFiles[i].isFile())
FilesDto returnDto = new FilesDto();
returnDto.setFileName(FilenameUtils.removeExtension(listOfFiles[i].getName()));
File file = new File("filename");
FileChannel channel = new RandomAccessFile(file, "rw").getChannel();
FileLock lock;
try
lock = channel.tryLock();
catch (OverlappingFileLockException e)
// File is already locked
if (lock==null)
returnDto.setStatus("unlocked");
returnDto.setFilePath(listOfFiles[i].getAbsolutePath());
else
lock.release();
returnDto.setStatus("Locked");
returnDtoList.add(returnDto);
【讨论】:
以上是关于java中的文件锁定的主要内容,如果未能解决你的问题,请参考以下文章