¿Existe una forma independiente de plataforma con Java para detectar el tipo de unidad en la que se encuentra un archivo? Básicamente estoy interesado en distinguir entre: discos duros, unidades extraíbles (como memorias USB) y redes compartidas. Las soluciones JNI/JNA no serán útiles. Java 7 se puede suponer.Java: cómo determinar el tipo de unidad en la que se encuentra un archivo?
Respuesta
La clase FileSystemView
de oscilación tiene algunos funcionalidad para apoyar detectar el tipo de la unidad (cf isFloppyDrive
, isComputerNode
). Me temo que no hay una forma estándar de detectar si una unidad está conectada a través de USB.
ideado, probado ejemplo:
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?
En el JDK 7 hay otra opción. No lo he usado, pero la API FileStore
tiene un método type
. El documentation dice que:
El formato de la cadena devuelta por este método es altamente específico de la implementación. Puede indicar, por ejemplo, el formato utilizado o si el almacén de archivos es local o remoto.
Al parecer, la manera de utilizarlo sería la siguiente:
import java.nio.*;
....
for (FileStore store: FileSystems.getDefault().getFileStores()) {
System.out.printf("%s: %s%n", store.name(), store.type());
}
FileSystemView.isFloppyDrive() es implementado por algo como "path.equals (" A: \\ ")" lo que desafortunadamente no será útil. Además, no encontré útil FileStore.type(). Devuelve "NTFS" para mis recursos compartidos de red. – mstrap
FileStore # type() devuelve "NTFS" para unidades de red en Windows 7, Java 7. –
FileStore # type() devuelve "NTFS" para discos duros locales en Windows 10, también. – simpleuser
echar un vistazo en esta discusión: How can I get list of all drives but also get the corresponding drive type (removable,local disk, or cd-rom,dvd-rom... etc)?
pagan Específicamente atención en http://docs.oracle.com/javase/1.5.0/docs/api/javax/swing/filechooser/FileSystemView.html
personalmente no han utilizado este pero parece relevante. Tiene método como es isFloppyDrive
.
También echa un vistazo en JSmooth
FileSystemView no funcionará. JSmooth podría funcionar, aunque esperaba encontrar alguna API que se envíe con el JRE. – mstrap
Se podría ejecutar cmd usando Java con:
fsutil fsinfo drivetype {drive letter}
El resultado le dará algo como esto:
C: - Fixed Drive
D: - CD-ROM Drive
E: - Removable Drive
P: - Remote/Network Drive
Aquí es una Gist cuales muestra cómo determinar esto usando net use
: https://gist.github.com/digulla/31eed31c7ead29ffc7a30aaf87131def
La parte más importante del código:
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. Encuentra dinámicamente la clase que representa un tipo Java primitivo
- 2. ¿La mejor manera de determinar el tipo de mime de un archivo en java?
- 3. ¿Se puede determinar el tamaño del archivo que se descargará?
- 4. Encuentra qué tipo de archivo se carga en vim
- 5. Cómo determinar el tipo de certificado desde el archivo
- 6. La lectura de un archivo que se encuentra en la memoria con libavformat
- 7. cómo determinar el fabricante de la unidad flash USB?
- 8. Determinar dónde se define un tipo
- 9. PowerShell: ¿es posible determinar el tipo MIME de un archivo?
- 10. de comandos de Java que no se encuentra en Linux
- 11. ¿La forma más elegante de aplicar un operador que se encuentra como una cadena en java?
- 12. ¿Cómo puedo determinar el tamaño de un tipo en Haskell?
- 13. ¿Cómo determinar si un tipo es un tipo de colección?
- 14. ¿Cómo puedo determinar el tipo de repositorio SVN que tengo?
- 15. ¿Cómo puedo determinar si una fecha se encuentra entre dos fechas en Java?
- 16. Python/espuma: no tipo que se encuentra: 'xs: complexType'
- 17. Determinar si la fecha de hoy se encuentra en un rango de dos fechas en IOS
- 18. ¿Cómo obtengo el directorio en el que se encuentra el archivo jar que se está ejecutando actualmente?
- 19. ¿Dónde se encuentra un archivo RDL publicado?
- 20. Cómo determinar rápidamente si un método se reemplaza en Java
- 21. donde se encuentra el archivo JSTL .tld?
- 22. ¿Cómo determinar cuándo se ha alcanzado el final del archivo?
- 23. ¿Cómo uso Java para leer desde un archivo en el que se está escribiendo activamente?
- 24. ¿Cómo averiguar el tipo declarado de un identificador en Java?
- 25. ¿Cómo puedo determinar si un archivo es un archivo PDF?
- 26. Determinar el número de páginas en un archivo PDF
- 27. ¿Cómo puedo hacer que NERDTree se abra en la misma unidad que el archivo que estoy editando?
- 28. ¿Los paquetes no tienen que coincidir con los subdirectorios en los que se encuentra el archivo java?
- 29. ¿Cómo determinar el tipo "real" de un valor de interfaz {}?
- 30. En PowerShell, ¿cómo puedo determinar si la unidad actual es una unidad en red o no?
Quizás sería más fácil de resolver ¿por qué quieres saber esto? –
Necesito esa información para advertir a los usuarios sobre ciertos inconvenientes del sistema de archivos subyacente: el rendimiento, la supervisión del sistema de archivos no funcionará, cosas así. – mstrap
Consulte http://stackoverflow.com/questions/3542018/how-can-i-get-list-of-all-drives-but-also-get-the-corresponding-drive-type-remo/17972420#17972420 Estoy usando WMI para acceder a la información deseada. –