Java: как определить тип диска, на котором расположен файл? - PullRequest
9 голосов
/ 06 февраля 2012

Существует ли в Java независимый от платформы способ определения типа диска, на котором находится файл? В основном мне интересно различать: жесткие диски , съемные диски (например, USB-флешки) и сетевые ресурсы . Решения JNI / JNA не помогут. Можно предположить Java 7.

Ответы [ 4 ]

5 голосов
/ 26 марта 2013

Вы можете выполнить cmd, используя Java с:

fsutil fsinfo drivetype {drive letter}

Результат даст вам что-то вроде этого:

C: - Fixed Drive
D: - CD-ROM Drive
E: - Removable Drive
P: - Remote/Network Drive
4 голосов
/ 06 февраля 2012

Класс FileSystemView от Swing имеет некоторые функциональные возможности для поддержки определения типа привода (cf isFloppyDrive, isComputerNode).Боюсь, что нет стандартного способа определить, подключен ли диск через USB.

Придуманный, непроверенный пример:

import javax.swing.JFileChooser;
import javax.swing.filechooser.FileSystemView;
....
JFileChooser fc = new JFileChooser();
FileSystemView fsv = fc.getFileSystemView();
if (fsv.isFloppyDrive(new File("A:"))) // is A: a floppy drive? 

В JDK 7 есть еще один вариант.Я не использовал его, но у FileStore API есть метод type.Документация гласит:

Формат строки, возвращаемой этим методом, сильно зависит от реализации.Это может указывать, например, используемый формат или хранилище файлов является локальным или удаленным.

Видимо, способ его использования будет следующим:

import java.nio.*;
....
for (FileStore store: FileSystems.getDefault().getFileStores()) {
    System.out.printf("%s: %s%n", store.name(), store.type());
} 
1 голос
/ 18 ноября 2016

Вот гистограмма, которая показывает, как определить это с помощью net use: https://gist.github.com/digulla/31eed31c7ead29ffc7a30aaf87131def

Самая важная часть кода:

    public boolean isDangerous(File file) {
        if (!IS_WINDOWS) {
            return false;
        }

        // Make sure the file is absolute
        file = file.getAbsoluteFile();
        String path = file.getPath();
//        System.out.println("Checking [" + path + "]");

        // UNC paths are dangerous
        if (path.startsWith("//")
            || path.startsWith("\\\\")) {
            // We might want to check for \\localhost or \\127.0.0.1 which would be OK, too
            return true;
        }

        String driveLetter = path.substring(0, 1);
        String colon = path.substring(1, 2);
        if (!":".equals(colon)) {
            throw new IllegalArgumentException("Expected 'X:': " + path);
        }

        return isNetworkDrive(driveLetter);
    }

    /** Use the command <code>net</code> to determine what this drive is.
     * <code>net use</code> will return an error for anything which isn't a share.
     * 
     *  <p>Another option would be <code>fsinfo</code> but my gut feeling is that
     *  <code>net</code> should be available and on the path on every installation
     *  of Windows.
     */
    private boolean isNetworkDrive(String driveLetter) {
        List<String> cmd = Arrays.asList("cmd", "/c", "net", "use", driveLetter + ":");

        try {
            Process p = new ProcessBuilder(cmd)
                .redirectErrorStream(true)
                .start();

            p.getOutputStream().close();

            StringBuilder consoleOutput = new StringBuilder();

            String line;
            try (BufferedReader in = new BufferedReader(new InputStreamReader(p.getInputStream()))) {
                while ((line = in.readLine()) != null) {
                    consoleOutput.append(line).append("\r\n");
                }
            }

            int rc = p.waitFor();
//            System.out.println(consoleOutput);
//            System.out.println("rc=" + rc);
            return rc == 0;
        } catch(Exception e) {
            throw new IllegalStateException("Unable to run 'net use' on " + driveLetter, e);
        }
    }
0 голосов
/ 06 февраля 2012

Посмотрите на это обсуждение: Как получить список всех дисков, а также получить соответствующий тип диска (съемный, локальный диск или CD-ROM, DVD-ROM ... и т. Д.)?

Специально обратите внимание на http://docs.oracle.com/javase/1.5.0/docs/api/javax/swing/filechooser/FileSystemView.html

Лично я не использовал это, но это кажется уместным. У него есть метод, подобный isFloppyDrive.

Также взгляните на JSmooth

...