有 Java 编程相关的问题?

你可以在下面搜索框中键入要查询的问题!

java中的filelock文件锁定

我有一个文件夹中的文件列表, 我想锁定一个特定文件(用户向我发送要锁定的文件名),我的操作如下:

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

这两个代码段来自不同的API。 如何检查已锁定或未锁定的文件的状态


共 (1) 个答案

  1. # 1 楼答案

    FileLock类上的documentation表示:

    This file-locking API is intended to map directly to the native locking facility of the underlying operating system. Thus the locks held on a file should be visible to all programs that have access to the file, regardless of the language in which those programs are written.

    因此,您似乎可以使用与第一个代码片段相同的代码:

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