Lister un dossier en Unix comparativement a un PC

Marc-André

Membre actif
24 Juillet 2003
559
17
49
Ottawa
Voilà mon petit problème je suis à la traduction d'un prog Java qui vient d'une plateforme PC mais je voudrais l'avoir sur Mac. Je n'arrive pas a trouver l'équivalent à ceci sur PC
Voici comment j'appel ma fonction:
Bloc de code:
 ListDir DirList = new ListDir(("c:/"));

Et voici la fonction qui liste les fichier:
Bloc de code:
private void sendDataList(String message[]){
        String concatMessage="";
        try{
            for (int i=0; i<message.length; i++){
//            Iterate through files
                concatMessage=concatMessage + "\nServer file " +(i+1)+" :"+ message[i];
          //  output.writeObject("Server>>> "+ (i+1)+": "+ message[i]);
            }
            output.writeObject("Server>>> \n"+ concatMessage);
            output.flush();
            }
            catch (IOException ioExecpetion){
            }
            }
    /*    int count=0;
        do{
            count ++;
            sendData(message[count]);
        }while (message.length>count-1);
    }*/
    
    private void displayMessage(final String messageToDisplay){
            System.out.println(messageToDisplay);
    }
    private void displayMessage(final String messageToDisplay[]){
        for (int i=0; i<messageToDisplay.length; i++){
            //Iterate through files
          System.out.println("Server file "+ (i+1)+": "+ messageToDisplay[i]);
          }

J'ai bien tenté d'insérer un "/" ou un "." de mettre "~/" j'ai toujour un problème de compilation

Pour une ligne de code j'aimerais ne pas créer 200 lignes... si quelqu'un a une petite idées simple je suis preneurs


Marc-André
 
Du Java ???.... J'arrive !!!


Tout d'abord, il est préférable (voire obligatoire) d'utiliser File.separator qui te renverra selon le système d'exploitation / ou \.

Après, ton problème est de référencer la racine. Dans ce cas, pourquoi ne pas passer par un paramètre extérieur à ton application ? Voici comment procéder:

ListDir DirList = new ListDir(System.getProperty("initDir"));

Il faudra que tu lances ton programme de la manière suivante: java -DinitDir="c:\"....
ou sous mac: java -DinitDir="/"

Autre piste: tu détectes l'OS sur lequel tu es pour proposer la racine par défaut. Note que cette solution ne nécessitera pas l'emploi d'un paramètre externe, mais se bornera à te renvoyer tout le temps au même point de départ....

D'où les deux solutions combinées font:

String startDir = System.getProperty("initDir", "");
if ("".equals(startDir)) {
if ("Mac OS X".equals(System.getProperty("os.name")) {​
startDir="/"; //ici on est sur du separator ;-)
}​
}

ainsi de suite
 
Merci pour ta réponse je vais tenter cela attentivement... Mais j'essai de comprendre les étapes

GrandGibus a dit:
Du Java ???.... J'arrive !!!


Tout d'abord, il est préférable (voire obligatoire) d'utiliser File.separator qui te renverra selon le système d'exploitation / ou \.

Ou est-ce que je mets cela?


GrandGibus a dit:
Après, ton problème est de référencer la racine. Dans ce cas, pourquoi ne pas passer par un paramètre extérieur à ton application ? Voici comment procéder:

ListDir DirList = new ListDir(System.getProperty("initDir"));

Il faudra que tu lances ton programme de la manière suivante: java -DinitDir="c:\"....
ou sous mac: java -DinitDir="/"

Ça c'est fait mais vu que je n'est pas fais l'étape un il ne fonctionne pas c'est possible?

GrandGibus a dit:
Autre piste: tu détectes l'OS sur lequel tu es pour proposer la racine par défaut. Note que cette solution ne nécessitera pas l'emploi d'un paramètre externe, mais se bornera à te renvoyer tout le temps au même point de départ....

D'où les deux solutions combinées font:

String startDir = System.getProperty("initDir", "");
if ("".equals(startDir)) {
if ("Mac OS X".equals(System.getProperty("os.name")) {​
startDir="/"; //ici on est sur du separator ;-)
}​
}
ainsi de suite

Java multi-plateforme mais pas toujours hein?!?

Merci

Marc-André
 
ARGGHHHH Mais que si, Java est multi-plateforme !!!

Pour répondre à tes questions:
File.separator est une variable statique de la classe File (java.io.File). Comme tu l'as remarqué, le séparateur de fichiers change d'un système d'exploitation à l'autre... Et donc, il faut utiliser File.separator quand tu as besoin de construire un chemin dans une arbo. Ainsi c'est la machine virtuelle qui s'occupe de remplacer par un '/' sous *nix et par un '\' sous Windows.

L'astuce du System.getProperty est un moyen propre de passer des paramètres à un programme Java. Par exemple si tu dois passer en parametre l'URL d'un serveur et des paramètres de connection d'une base de données, tu vas faire un fichier truc.properties et mettre dedans une suite de paires clé / valeur comme suit:
db.server = lamachine​
db.user = jean​

Un substitut au fichier est le -Ddb.server=lamachine -Ddb.user=jean

Ainsi ça évite d'avoir à charger le fichier ;).

Coté Java, dans ton code, tu peux récupérer en faisant un System.getProperty("db.user") la valeur Jean.

Pour ton programme, je te suggérais donc de passer de la sorte pour dire à ton programme le point d'entrée à chercher par défaut. La seule différence sera la valeur du paramètre à changer: /User/fred sous mac et "c:\Program Files" sous Windows. Mais ton programme Java n'aura pas été recompilé... ce qui justifie amplement le write once, run anywhere.
 
En passant, et sans vouloir pinailler, il est aussi préférable pour des raisons de performance, d'utiliser un StringBuffer pour faire de la concaténation de chaines de caractère... une fois terminé, tu peux renvoyer un toString() (pour obtenir la chaine concaténée).
 
Par contre, il faut faire bien attention, il ne faut pas utiliser le fileSeparator pour les chemins dans les packages (.jar), ce sont les "/" qui sont reconnus dans ce cas.