Как использовать 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 + ":*"));
}

Может быть, существует представление с информацией, которую вы ищете... Хотя нет гарантии.

Другие вопросы по тегам