Как использовать Files.getFileStore() для накопителя на диске (в Windows)?
При вызове Files.getFileStore()
на накопителе с диском (в Windows) это приводит к следующей ошибке:
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 ответа
Взгляните на этот отчет об ошибке JDK-8034057 и на соответствующий ответ от Алана Бейтмана.
Проблема в том, что "диск с диском" не является хранилищем файлов; он просто связывает букву диска с путем на существующем диске.
Ты сделал:
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 + ":*"));
}
Может быть, существует представление с информацией, которую вы ищете... Хотя нет гарантии.