2010-09-30 20 views
8

La historia detrás ...El descubrimiento de Java

me gusta mucho los programas de televisión, pero vuelvo a casa sólo dos veces al mes. El resto del tiempo vivo en una casa sin internet (cerca de mi universidad, ¡así que wifi gratis oscila! - cuando funciona -) así que necesitaba un pequeño programa que podía actualizar mi disco duro portátil con mis nuevos programas cuando regreso a casa, el servidor de archivos sincronizado con los podcasts hace su trabajo. Lo hice usando Java y funciona.

El problema

Ahora mismo tengo un archivo.properties donde almacenó el directorio montado de ese USB HD. No es suficiente. Quiero que el software pueda descubrir todos los dispositivos de almacenamiento masivo USB y permita que el usuario seleccione cuál usar para almacenar archivos. ¿Cómo puedo hacer eso?

detalles

a) tiene que ser en Java (quiero decir, también podría trabajar con la ejecución de comandos locales de acogida como dir o algo por el estilo)

b) mi servidor es en Windows, pero prefiero que sea una solución independiente del sistema operativo

+0

No estoy seguro si Java incluso tiene acceso a tales detalles de FS: es bastante complicado en código nativo =/También me gustaría saber, así que vamos a ver si alguien sabe. – Piskvor

+0

Bueno, sé con certeza que en C# tiene un 'System.IO.DriveInfo'. Espero que haya algo similar con Java. – dierre

+0

a) ¿tiene que ser Java? b) ¿qué sistema operativo? –

Respuesta

3

Si bien no lo vi en su pregunta, supongo que está muy familiarizado con el método File.listRoots() que devuelve una matriz de archivos well, file roots .

Luego, podría simplemente iterar sobre ellas e intentar identificar si son unidades de memoria. Algunos hacks pueden ser como:

File[] roots = File.listRoots(); 

if (roots == null) { 
    // you have a different problem here. Is it even a computer we are talking about? 
} 

// Iterate through roots 
for (File root : roots) { 
    if (root.canWrite()) { // Or, you could use File.createTempfile with that folder 
     // if root does not contain some well know files 
     // Or, if root contains some well known files 
     // Based on these 2 hacks, or possible other characteristics, you may be reasonably sure 
    } 
} 

Eso es todo lo que puedo ofrecer. Se puede hacer mucho más con más programas nativos y luego invocarlos desde el programa Java.

+0

Ok, supongo que está sugiriendo que debería crear condiciones para comprobar si se trata de un dispositivo conocido. Por ejemplo, si mi raíz contiene el directorio 'Documents and Settings', entonces estoy en Windows XP. ¿Derecha? – dierre

+0

Bueno, descubrir que el sistema operativo es más sencillo (System.getProperty ("os.name"), etc.). Me refería a distinguir el disco duro externo de otras unidades posibles (disco duro, iPod, CD, DVD, etc.). –

+0

Bueno, me ha gustado su sugerencia. Usé listRoots para Windows y JNI para Linux con mount. – dierre

2

Puede consultar el proyecto javax.usb. Actualmente hay dos implementaciones certificadas, para Linux y BSD, y una implementation for windows (como parece, todavía no está completa, pero supongo que le permite enumerar los dispositivos USB conectados).

Pero no estoy seguro de si la posibilidad de listar sólo las unidades USB (en lugar de todas las unidades como en @Amrinder Arora respuesta) vale la pena adoptar un nuevo conjunto biblioteca y lucha con una aplicación semi-completa ...

1

Una hermosa manera se ha proporcionado en nio. Verifique esto:

import java.nio.file.*; 
for(Path p:FileSystems.getDefault().getRootDirectories()){ 
    System.out.println(p); 
} 

Obtendrá All roots as path objects;

Cuestiones relacionadas