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

时间:2015-11-26 13:30:15

标签: java nio subst

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)

如何解决此问题并获得FileStore的适当P:

2 个答案:

答案 0 :(得分:2)

查看此错误报告JDK-8034057以及Alan Bateman的相关答案。

答案 1 :(得分:1)

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

你做了:

subst p: c:\temp

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

注意:这只是一个假设,我实际上并没有运行Windows。但是,如果您尝试迭代文件存储(即通过调用.getFileSystem().getFileStores()实例上的Path),则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 + ":*"));
}

也许存在您正在寻找的信息的视图......但不保证。