如何将 Files.getFileStore() 用于替代驱动器(在 Windows 上)?

How to use Files.getFileStore() for substed drive (on Windows)?

substed 驱动器(在 Windows 上)调用 Files.getFileStore() 时,会导致以下错误:

The directory is not a subdirectory of the root directory

例如:

subst P: C:\temp

运行:

public static void main(String[] args) throws IOException {
    final Path dir = Paths.get("P:/sub");
    final FileStore fileStore = Files.getFileStore(dir);
    fileStore.isReadOnly();
}

结果:

Exception in thread "main" java.nio.file.FileSystemException: P:\sub: The directory is not a subdirectory of the root directory.

    at sun.nio.fs.WindowsException.translateToIOException(WindowsException.java:86)
    at sun.nio.fs.WindowsException.rethrowAsIOException(WindowsException.java:97)
    at sun.nio.fs.WindowsException.rethrowAsIOException(WindowsException.java:102)
    at sun.nio.fs.WindowsFileStore.create(WindowsFileStore.java:92)
    at sun.nio.fs.WindowsFileSystemProvider.getFileStore(WindowsFileSystemProvider.java:482)
    at java.nio.file.Files.getFileStore(Files.java:1411)
    at utils.FileStoreMain.main(FileStoreMain.java:16)

如何解决此问题并为 P: 接收适当的 FileStore

问题是 "substed drive" 不是文件存储;它只是将驱动器号与现有驱动器上的路径相关联。

你做到了:

subst p: c:\temp

这意味着,实际上,您 p:\sub 的真实文件存储是与 c: 关联的驱动器。

注意:这只是一个假设,我实际上并不运行 windows。但是,如果您尝试遍历文件存储(即,通过在您的 Path 实例上调用 .getFileSystem().getFileStores()),那么 P: 将不会出现。

现在,问题仍然是如何获得真正的文件存储,如果可能的话。也许 FileAttributeView 存在可以为您提供此信息;尝试使用以下代码查看您可以使用哪些属性视图及其参数:

// using some Path instance named path...
final FileSystem fs = path.getFileSystem();
final Set<String> viewNames = fs.supportedFileAttributesView();

for (final String viewName: viewNames) {
    System.out.println("View " + viewName + ':');
    System.out.println(Files.readAttributes(path, viewName + ":*"));
}

也许存在包含您要查找的信息的视图...但不能保证。

查看此错误报告 JDK-8034057 and at a related answer from Alan Bateman