如何将 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。
在 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。