Java:ファイルが配置されているドライブの種類を判断する方法は?

ファイルが置かれているドライブの種類を検出するためにJavaにプラットフォームに依存しない方法はありますか?基本的には、ハードディスクリムーバブルドライブ(USBスティックなど)、ネットワーク共有の区別に興味があります。 JNI/JNAソリューションは役に立ちません。 Java 7が想定されます。

9
ファイルシステムの特定の欠点についてユーザーに警告するための情報が必要です。パフォーマンス、ファイルシステムの監視は機能しません。
追加された 著者 mstrap,
おそらく、あなたがこれを知りたい理由を解決する方が簡単かもしれません。
追加された 著者 Peter Lawrey,
stackoverflow.com/questions/3542018/… WMIを使用して必要な情報にアクセスしています。
追加された 著者 Martin Vysny,

4 答え

Javaを使ってcmdを実行するには、次のようにします。

fsutil fsinfo drivetype {drive letter}

結果は次のようになります:

C: - Fixed Drive
D: - CD-ROM Drive
E: - Removable Drive
P: - Remote/Network Drive
4
追加された
これはプラットフォームに依存しないため、fsutilは管理者権限を必要とするようです。
追加された 著者 mstrap,
私はこのコードが非常に有用であることがわかりました:stackoverflow.com/questions/10678363 /…
追加された 著者 MAbraham1,
私も(非常に有用)
追加された 著者 philwalk,
3
追加された
FileSystemView.isFloppyDrive()は "path.equals(" A:\\ ")"のようなもので実装されていますが、残念ながらそれは役に立たないでしょう。また、FileStore.type()が役に立ちませんでした。私のネットワーク共有の "NTFS"を返します。
追加された 著者 mstrap,
FileStore#type()は、Windows 10のローカルハードドライブについても "NTFS"を返します。
追加された 著者 simpleuser,
FileStore#type()は、Windows 7、Java 7上のネットワークドライブの「NTFS」を返します。
追加された 著者 Benjamin Burkhart,

Here is a Gist which shows how to determine this using 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 net to determine what this drive is.
     * net use will return an error for anything which isn't a share.
     * 
     *  

Another option would be fsinfo but my gut feeling is that * net should be available and on the path on every installation * of Windows. */ private boolean isNetworkDrive(String driveLetter) { List 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
追加された

Take a look on this discussion: How can I get list of all drives but also get the corresponding drive type (removable,local disk, or cd-rom,dvd-rom... etc)?

Specifically pay attention on http://docs.oracle.com/javase/1.5.0/docs/api/javax/swing/filechooser/FileSystemView.html

私は個人的にこれを使用していませんが、それは関連性があるようです。 isFloppyDrive のようなメソッドがあります。

Also take a look on JSmooth

0
追加された
FileSystemViewは機能しません。私はJRE自体に付属しているAPIを見つけようとしていましたが、JSmoothが機能するかもしれません。
追加された 著者 mstrap,