2012-02-06 35 views
9

Có cách nào không có nền tảng với Java để phát hiện loại ổ đĩa được đặt trên đó không? Về cơ bản, tôi muốn phân biệt giữa: đĩa cứng, ổ đĩa rời (như thanh USB) và chia sẻ mạng. Các giải pháp JNI/JNA sẽ không hữu ích. Java 7 có thể được giả định.Java: làm cách nào để xác định loại tệp ổ đĩa được đặt trên?

+0

Có lẽ đơn giản hơn để giải quyết lý do bạn muốn biết điều này? –

+2

Tôi cần thông tin đó để cảnh báo người dùng về những hạn chế nhất định của hệ thống tệp cơ bản: hiệu suất, giám sát hệ thống tệp sẽ không hoạt động, những thứ tương tự. – mstrap

+0

Vui lòng xem http://stackoverflow.com/questions/3542018/how-can-i-get-list-of-all-drives-but-also-get-the-corresponding-drive-type-remo/17972420#17972420 Tôi đang sử dụng WMI để truy cập thông tin mong muốn. –

Trả lời

3

Lớp FileSystemView từ Swing có một số chức năng để hỗ trợ việc phát hiện các loại ổ đĩa (cf isFloppyDrive, isComputerNode). Tôi e rằng không có cách nào tiêu chuẩn để phát hiện nếu một ổ đĩa được kết nối thông qua USB mặc dù.

giả tạo, chưa được kiểm tra ví dụ:

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? 

Trong JDK 7 có một tùy chọn. Tôi chưa sử dụng, nhưng API FileStore có phương thức type. documentation nói rằng:

Định dạng của chuỗi trả về theo phương pháp này được thực hiện rất cụ thể. Nó có thể chỉ ra, ví dụ, định dạng được sử dụng hoặc nếu lưu trữ tập tin là cục bộ hoặc từ xa.

Rõ ràng cách sử dụng nó sẽ là:

import java.nio.*; 
.... 
for (FileStore store: FileSystems.getDefault().getFileStores()) { 
    System.out.printf("%s: %s%n", store.name(), store.type()); 
} 
+4

FileSystemView.isFloppyDrive() được thực hiện bởi một cái gì đó như "path.equals (" A: \\ ")" những gì không may sẽ không hữu ích. Ngoài ra, tôi không tìm thấy FileStore.type() hữu ích. Nó trả về "NTFS" cho các chia sẻ mạng của tôi. – mstrap

+3

FileStore # type() trả về "NTFS" cho các ổ đĩa mạng trên Windows 7, Java 7. –

+0

FileStore # type() trả về "NTFS" cho các ổ đĩa cứng cục bộ trên Windows 10, quá. – simpleuser

1

Hãy nhìn vào cuộc thảo luận này: How can I get list of all drives but also get the corresponding drive type (removable,local disk, or cd-rom,dvd-rom... etc)?

Cụ chú ý trên http://docs.oracle.com/javase/1.5.0/docs/api/javax/swing/filechooser/FileSystemView.html

Cá nhân tôi đã không sử dụng này nhưng có vẻ như có liên quan. Nó có phương pháp như là isFloppyDrive.

Ngoài ra hãy xem trên JSmooth

+0

FileSystemView sẽ không hoạt động. JSmooth có thể làm việc, mặc dù tôi đã hy vọng tìm thấy một số API mà tàu với chính JRE. – mstrap

4

Bạn có thể thực hiện cmd sử dụng Java với:

fsutil fsinfo drivetype {drive letter} 

Kết quả sẽ cung cấp cho bạn một cái gì đó như thế này:

C: - Fixed Drive 
D: - CD-ROM Drive 
E: - Removable Drive 
P: - Remote/Network Drive 
+3

Nó không phải là nền tảng độc lập và fsutil thậm chí dường như yêu cầu quyền quản trị. – mstrap

+1

Tôi thấy mã này rất hữu ích: http://stackoverflow.com/questions/10678363/find-the-directory-for-a-filestore – MAbraham1

+0

tôi cũng vậy (rất hữu ích) – philwalk

0

Đây là một Gist mà cho thấy cách xác định điều này bằng cách sử dụng net use: https://gist.github.com/digulla/31eed31c7ead29ffc7a30aaf87131def

Phần quan trọng nhất của mã:

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); 
     } 
    } 
Các vấn đề liên quan