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?
Trả lời
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());
}
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
FileStore # type() trả về "NTFS" cho các ổ đĩa mạng trên Windows 7, Java 7. –
FileStore # type() trả về "NTFS" cho các ổ đĩa cứng cục bộ trên Windows 10, quá. – simpleuser
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
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
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
Đâ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);
}
}
- 1. Làm thế nào để xác định số lượng tệp trên một ổ đĩa bằng Python?
- 2. Làm cách nào để hủy kích hoạt ổ đĩa vật lý LVM2 để tháo ổ đĩa?
- 3. Làm cách nào để nhận được số ổ đĩa cứng của ổ USB trên OS X?
- 4. WiX - Cài đặt tệp vào ổ đĩa hệ thống
- 5. xác định định dạng hệ thống tệp của một loại đĩa trong java như ntfs, fat16/32 hoặc ext
- 6. Làm thế nào để liệt kê nhiều loại tệp Mime từ ổ đĩa Google?
- 7. Làm thế nào để xác định xem một ổ đĩa là ảo hoặc vật lý
- 8. Lấy tên ổ đĩa (như trái ngược với ký tự ổ đĩa) trong Java
- 9. Chia sẻ ổ đĩa được ánh xạ trên Windows
- 10. Làm cách nào để có được đường dẫn UNC cho tệp được truy cập thông qua ổ đĩa mạng?
- 11. Làm cách nào để phát hiện xem có đĩa mềm trong ổ đĩa?
- 12. Phát hiện khi ổ đĩa được lắp trên OS X
- 13. Tăng ổ cắm asio: cách nhanh nhất để đọc tệp từ ổ đĩa cứng?
- 14. Tôi làm cách nào để truy cập ổ đĩa mạng được ánh xạ với System.IO.DirectoryInfo?
- 15. Định dạng ổ đĩa bằng C++
- 16. Làm cách nào để xác định xem tệp mở là ổ cắm hay đường ống?
- 17. Cách tải xuống tệp từ ổ đĩa google bằng cách sử dụng drive api java?
- 18. Làm thế nào để làm cho sqlite mạnh mẽ trên một ổ đĩa chia sẻ Windows
- 19. Có thể định dạng thẻ nhớ, ổ đĩa bút hoặc đĩa bằng Java không?
- 20. Nhanh chóng phát hiện loại bỏ các ổ đĩa IDE cố định trong Windows XP
- 21. Làm cách nào để thay đổi ký tự ổ đĩa ở chế độ ido (Emacs)?
- 22. Xác định loại được xác định
- 23. Cách tạo ổ đĩa CD ảo trên Mac OS X
- 24. Xác định hình học đĩa trên Windows
- 25. Liên kết ổ đĩa UNC/Mạng trên trang html
- 26. Làm thế nào tôi có thể lấy danh sách tất cả các ổ đĩa mà còn nhận được loại ổ tương ứng (ổ đĩa di động, đĩa cục bộ hoặc đĩa CD-rom, dvd-rom ... vv)?
- 27. IOKhông đủ dung lượng ổ đĩa khi truy cập ổ đĩa gắn Citrix
- 28. Làm cách nào để truy cập ổ đĩa mạng thông qua các lớp System.IO thông thường?
- 29. Có cách nào để phát hiện xem ổ đĩa có phải là ổ SSD không?
- 30. script để ánh xạ ổ đĩa mạng
Có lẽ đơn giản hơn để giải quyết lý do bạn muốn biết điều này? –
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
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. –