如何在Java中检查文件系统是否支持硬链接和符号链接

5

Java 7引入的Files类具有处理链接和符号链接的方法,但仅作为可选操作。

在实际调用相应方法之前,是否有任何方法可以在运行时确定文件系统是否支持这些操作,还是需要调用它们然后捕获异常?

FileSystemFileStore等类似类似似乎没有包含任何相关内容(或者我可能已经忽略了)。


文档中写道:如果实现不支持符号链接或数组包含无法在创建符号链接时原子设置的属性,则会引发UnsupportedOperationException异常。 - Akira
也许这个可以帮到你:https://dev59.com/YGDVa4cB1Zd3GeqPhNl_ - Akira
1
@Akira 这就是我所说的捕获异常的意思 ;) - shutefan
1个回答

4
我不认为有任何通用方法可以在不依赖于UnsupportedOperationException或其他异常的情况下运行。您可以使用一种启发式方法,假设只有BasicFileAttributesView的子类支持符号链接。
注意:下面的方法不起作用,因为FileAttributeViews和文件属性并不是相同的概念:
我使用以下代码在OS X 10.8.4上没有得到isSymbolicLink作为支持的属性之一。
package com.mlbam.internal;

import java.nio.file.Files;
import java.nio.file.FileStore;
import java.nio.file.FileSystems;
import java.nio.file.Paths;

import org.slf4j.Logger;
import org.slf4j.LoggerFactory;

public class MainClass {
    private static final Logger LOG = LoggerFactory.getLogger(MainClass.class);
    public static void main(String[] args) {
        try {
            System.out.println("FileStore.supportsFileAttributeView('isSymbolicLink'): " 
                + Files.getFileStore(Paths.get("/")).supportsFileAttributeView("isSymbolicLink"));
            // Got: FileStore.supportsFileAttributeView('isSymbolicLink'): false
            System.out.println(FileSystems.getDefault().supportedFileAttributeViews());
            // Got: [basic, owner, unix, posix]
        } catch (Exception e) {}
    }
}

原始答案:

如果您有一个 FileStore 实例,可以使用 FileStore.supportsFileAttributeView("isSymbolicLink")

或者,如果您有一个 FileSystem 实例,可以检查从 FileSystem.supportedFileAttributeViews() 返回的 Set<String> 是否包含字符串 "isSymbolicLink"


你可以使用Files.getFileStore(Path)获取与Path相关联的FileStore
获取FileSystem的一种方法是通过FileSystems.getDefault()

1
嗯,令人惊讶的是,在带有NTFS的Windows机器上似乎无法正常工作 - 我以为它支持符号链接?稍后会在Linux上尝试一下... - shutefan
@shutefan,看起来你是正确的,我的答案可能不对。在OS X上也无法工作。不确定该如何解决这个问题。我应该标记答案吗?我宁愿不删除,这样其他人就可以看到这种方法行不通。 - yegeniy
谢谢你的尝试!我宁愿保留答案作为参考,这样其他人就不会徒劳无功地尝试相同的事情了。 - shutefan
同意。无论如何,对于大多数实际目的,我打赌人们可以使用 Files.isSymbolicLink(Path)(请注意,这并没有记录为抛出 UnsupportedOperationException)。 - yegeniy
2
supportsFileAttributeView 方法需要 FileAttributeView 的名称,而不是文件属性的名称。这就是为什么它总是返回 false。同样,FileSystem.supportsFileAttributeViews 返回 FileAttributeViews 的名称,而不是文件属性的名称。请参见 Files.getAttribute 以了解两种类型名称的说明。 - VGR
+1 @VGR,我明天会更新答案(或者你可以帮我编辑)。 - yegeniy

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接