2010-09-30 5 views
21

Comment puis-je détecter si une clé USB est connectée à un ordinateur sous Windows, Linux ou Mac? La seule façon que j'ai vu en ligne pour faire ceci est d'itérer les disques, mais je ne pense pas qu'il y ait un très bon moyen de faire cela multi-plateforme (par exemple File.listRoots() dans Linux ne renvoie que "/"). Même sous Windows, cela causerait des problèmes de lecture de chaque périphérique, comme un lecteur réseau qui prend beaucoup de temps à accéder.Détection d'une clé USB en Java

Il existe une bibliothèque appelée jUsb qui semble fonctionner sous Linux, mais elle ne fonctionne pas sous Windows. Il existe également une extension appelée jUsb pour Windows, mais cela nécessite que les utilisateurs installent un fichier dll et exécutent un fichier .reg. Aucun d'entre eux ne semble être développé pour plusieurs années, donc j'espère qu'une meilleure solution existe maintenant. Ils sont également exagérés pour ce dont j'ai besoin, quand je veux seulement détecter si un périphérique est connecté qui contient un fichier dont j'ai besoin.

[Modifier] De plus, JUSB ne semble pas travailler avec une version récente de Java, donc ce n'est pas même une option ...

Merci

Répondre

8

La dernière fois que j'ai vérifié il n'y avait pas ouvert bibliothèque USB source pour Java et Windows. Le simple hack que j'ai utilisé était d'écrire une petite application JNI pour capturer l'événement WM_DEVICECHANGE. Suivi des liens peuvent aider

  1. http://www.codeproject.com/KB/system/DriveDetector.aspx
  2. http://msdn.microsoft.com/en-us/library/aa363480(v=VS.85).aspx

Si vous ne voulez pas salir avec la JNI puis utilisez toutes les fenêtres bibliothèque native de l'USB avec la JNA (https://github.com/twall/jna/)

bien que je suggère d'utiliser WM_DEVICECHANGE approche ... parce que votre exigence est juste un message de notification ....

8
public class AutoDetect { 

static File[] oldListRoot = File.listRoots(); 
public static void main(String[] args) { 
    AutoDetect.waitForNotifying(); 

} 

public static void waitForNotifying() { 
    Thread t = new Thread(new Runnable() { 
     public void run() { 
      while (true) { 
       try { 
        Thread.sleep(100); 
       } catch (InterruptedException e) { 
        e.printStackTrace(); 
       } 
       if (File.listRoots().length > oldListRoot.length) { 
        System.out.println("new drive detected"); 
        oldListRoot = File.listRoots(); 
        System.out.println("drive"+oldListRoot[oldListRoot.length-1]+" detected"); 

       } else if (File.listRoots().length < oldListRoot.length) { 
    System.out.println(oldListRoot[oldListRoot.length-1]+" drive removed"); 

        oldListRoot = File.listRoots(); 

       } 

      } 
     } 
    }); 
    t.start(); 
} 
} 
+1

Le deuxième paragraphe de la question décrit spécifiquement pourquoi cette approche n'est pas souhaitée. – VGR

-1

J'ai créé le code qui fonctionne sous Linux et Windows vérifier cette

import java.io.BufferedReader; 
import java.io.File; 
import java.io.IOException; 
import java.io.InputStreamReader; 

public class Main{ 
public static void main(String[] args) throws IOException{//main class 
    Main m = new Main();//main method 
    String os = System.getProperty("os.name").toLowerCase();//get Os name 
    if(os.indexOf("win") > 0){//checking if os is *nix or windows 
     //This is windows 
     m.ListFiles(new File("/storage"));//do some staf for windows i am not so sure about '/storage' in windows 
     //external drive will be found on 
    }else{ 
     //Some *nix OS 
     //all *nix Os here 
     m.ListFiles(new File("/media"));//if linux removable drive found on media 
     //this is for Linux 

    } 


} 

void ListFiles(File fls)//this is list drives methods 
      throws IOException { 
    while(true){//while loop 


try { 
    Thread.sleep(5000);//repeate a task every 5 minutes 
} catch (InterruptedException e) { 
    // TODO Auto-generated catch block 
    e.printStackTrace(); 
} 
    Process p = Runtime.getRuntime().exec("ls "+fls);//executing command to get the output 
    BufferedReader br = new BufferedReader(new InputStreamReader(p.getInputStream()));//getting the output 
      String line;//output line 
       while((line = br.readLine()) != null){//reading the output 
       System.out.print("removable drives : "+line+"\n");//printing the output 
      } 
      /*You can modify the code as you wish. 
      * To check if external storage drivers pluged in or removed, compare the lenght 
      * Change the time interval if you wish*/ 
      } 

     } 
} 
+0

Ceci est complètement faux pour Windows, il boucle à l'infini et ne fait rien ... – BullyWiiPlaza

0

J'ai écrit ce programme. Au début du programme, faites DriverCheck.updateDriverInfo(). Ensuite, pour vérifier si une clé USB a été branchée ou retirée, utilisez DriverChecker.driversChangedSinceLastUpdate() (renvoie boolean).

Pour vérifier si une clé USB a été insérée, utilisez newDriverDetected(). Pour vérifier si une clé USB a été supprimée, utilisez driverRemoved()

Cela vérifie à peu près tous les lecteurs de disque de A:/à Z: /. La moitié d'entre eux ne peuvent même pas exister, mais je les vérifie tous de toute façon.

package security; 

import java.io.File; 

public final class DriverChecker { 
    private static boolean[] drivers = new boolean[26]; 

    private DriverChecker() { 

    } 

    public static boolean checkForDrive(String dir) { 
     return new File(dir).exists(); 
    } 

    public static void updateDriverInfo() { 
     for (int i = 0; i < 26; i++) { 
      drivers[i] = checkForDrive((char) (i + 'A') + ":/"); 
     } 
    } 

    public static boolean newDriverDetected() { 
     for (int i = 0; i < 26; i++) { 
      if (!drivers[i] && checkForDrive((char) (i + 'A') + ":/")) { 
       return true; 
      } 
     } 
     return false; 
    } 

    public static boolean driverRemoved() { 
     for (int i = 0; i < 26; i++) { 
      if (drivers[i] && !checkForDrive((char) (i + 'A') + ":/")) { 
       return true; 
      } 
     } 
     return false; 
    } 

    public static boolean driversChangedSinceLastUpdate() { 
     for (int i = 0; i < 26; i++) { 
      if (drivers[i] != checkForDrive((char) (i + 'A') + ":/")) { 
       return true; 
      } 
     } 
     return false; 
    } 

    public static void printInfo() { 
     for (int i = 0; i < 26; i++) { 
      System.out.println("Driver " + (char) (i + 'A') + ":/ " 
        + (drivers[i] ? "exists" : "does not exist")); 
     } 
    } 
} 
0

Consultez le code this. Pour répondre à vos demandes, il suffit de poll pour détecter le lecteur USB et continuer quand vous l'avez obtenu.

Questions connexes