IdentifiantMot de passe
Loading...
Mot de passe oublié ?Je m'inscris ! (gratuit)
Navigation

Inscrivez-vous gratuitement
pour pouvoir participer, suivre les réponses en temps réel, voter pour les messages, poser vos propres questions et recevoir la newsletter

Entrée/Sortie Java Discussion :

nom de fichier sensible à la casse


Sujet :

Entrée/Sortie Java

Vue hybride

Message précédent Message précédent   Message suivant Message suivant
  1. #1
    Membre confirmé
    Profil pro
    Inscrit en
    Mars 2003
    Messages
    82
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Mars 2003
    Messages : 82
    Par défaut nom de fichier sensible à la casse
    Bonjour à tous

    Je travaille sur une application que nous voulons être portable (normal me direz-vous c'est du Java ) sous différents OS (plus particulièrement Windows, Linux et Mac).

    Pourtant, j'ai un petit soucis, en effet à l'exécution de ce bout de code:

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
     
    if (!new File(filename).exists()){
      System.out.println("The file \"" + filename + "\" does not exist !");
      return;
    }
    En effet, personnellement je suis sous Windows et si je l'exécute avec n'importe quelle case pour le nom de fichier (toto.txt, ToTo.TXT, etc...), ça passe et tout se déroule bien.

    Et si un collègue l'exécute sous Mac, il faut qu'il mette exactement la bonne casse par rapport au fichier existant, sinon la méthode exists renvoie false.

    D'où mes questions:
    • C'est donc l'OS qui provoque cette différence ?

    • Comment avoir le même résultat sur les différents OS ? (soit complètement insensible à la casse ou soit complètement sensible à la casse) ?


    Merci d'avance pour vos réponses

  2. #2
    Membre Expert Avatar de alain.couthures
    Profil pro
    Gérant
    Inscrit en
    Avril 2007
    Messages
    902
    Détails du profil
    Informations personnelles :
    Localisation : France, Gironde (Aquitaine)

    Informations professionnelles :
    Activité : Gérant

    Informations forums :
    Inscription : Avril 2007
    Messages : 902
    Par défaut
    C'est bien l'OS qui est sensible ou non à la casse.

    En Java, on peut appliquer la méthode .toUpperCase() pour que la saisie soit transformée en majuscules mais si les noms des fichiers eux-mêmes sont à la fois en minuscules et en majuscules, je ne vois pas d'autre solution que de lire tout le répertoire et de comparer avec les .toUpperCase() de chaque fichier !

  3. #3
    Membre expérimenté Avatar de jibbi
    Profil pro
    Inscrit en
    Avril 2007
    Messages
    165
    Détails du profil
    Informations personnelles :
    Âge : 49
    Localisation : France

    Informations forums :
    Inscription : Avril 2007
    Messages : 165
    Par défaut
    Attention au separator
    unix-windows :
    For UNIX platforms, the prefix of an absolute pathname is always "/". Relative pathnames have no prefix. The abstract pathname denoting the root directory has the prefix "/" and an empty name sequence.
    For Microsoft Windows platforms, the prefix of a pathname that contains a drive specifier consists of the drive letter followed by ":" and possibly followed by "\\" if the pathname is absolute. The prefix of a UNC pathname is "\\\\"; the hostname and the share name are the first two names in the name sequence. A relative pathname that does not specify a drive has no prefix
    tu pourrais tester un truc comme ca
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
    14
    15
    16
    17
    18
    19
    20
    21
    22
    23
    24
    25
    26
    27
    28
    29
    30
    31
    32
    33
     
    import java.io.*;
    import java.lang.*;
     
     
    class MFile extends File {
    	public MFile(String file){
    		super(file);
    	}
     
    	//[...] autre constructor 
     
    	public boolean exists(){
    		if (super.exists()) // ce code à été testé
    			return true;	// avec cette partie en commentaire
     
    		File dir = new File(getParent());
    		String all [] = dir.list();		
    		for (String one : all){ 
    			if (one.equalsIgnoreCase(getName()));
    				return true;
    		}
    		return false;
    	}
     
    	public static void main(String [] arg){
     
    		MFile mf = new MFile("c:" + File.separator + "IO.SYS"); // windows uniquement 
    		p.rintln("le fichier exist: "+mf.exists());
     
    	}
     
    }
    Si quelqu'un possède un Mac sur ce forum essayer-le !

  4. #4
    Membre confirmé
    Profil pro
    Inscrit en
    Mars 2003
    Messages
    82
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Mars 2003
    Messages : 82
    Par défaut
    Salut !

    Merci pour vos réponses
    Je vais donc demander à mon collègue de tester le code suivant sous Mac:

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
    14
    15
    16
    17
    18
    19
    20
    21
    22
    23
    24
    25
    26
    27
    28
    29
    30
    31
    32
    33
    34
    35
    36
    37
    38
    39
    40
    41
     
    package tests;
     
    import java.io.*;
    import java.lang.*;
     
    public class MFile extends File {
     
    	public MFile(String file){
    		super(file);
    	}
     
    	public boolean exists(){
    		if (super.exists())
    			return true;
     
    		//Pour OS sensibles à la casse
    		File dir = new File(getParent());
    		String all [] = dir.list();		
    		for (String one : all){ 
    			if (one.equalsIgnoreCase(getName()))
    				return true;
    		}
    		return false;
    	}
     
    	/**
             * @param args
             * @throws IOException 
             */
    	public static void main(String[] args) throws IOException {
    		// TODO Auto-generated method stub
    		while (1==1){
    			System.out.println(" Nom du fichier à tester ?");
    			InputStreamReader lecteur=new InputStreamReader(System.in);
    			BufferedReader entree=new BufferedReader(lecteur);
    			MFile mf = new MFile(entree.readLine());
    			System.out.println("Le fichier existe: " + mf.exists());
    		}
    	}
    }
    Je vous tiens au courant pour info

  5. #5
    Membre confirmé
    Profil pro
    Inscrit en
    Mars 2003
    Messages
    82
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Mars 2003
    Messages : 82
    Par défaut
    jibbi !

    mon collègue a testé et ça fonctionne

    par contre, on aura sûrement d'autres problèmes si le fichier à chercher n'est pas en local.... entre les différents OS....
    sais-tu si il existe une une api pour avoir toujours qui uniformise un chemin (local ou distant) sur tous les OS? qui donnerait le même résultat niveau code mais dont la jvm se chargerait de transformer en fonction de l'os sous jacent ? ??

  6. #6
    Membre expérimenté Avatar de jibbi
    Profil pro
    Inscrit en
    Avril 2007
    Messages
    165
    Détails du profil
    Informations personnelles :
    Âge : 49
    Localisation : France

    Informations forums :
    Inscription : Avril 2007
    Messages : 165
    Par défaut

    Humm je suis déjà surpris que la class File ne fait pas le travail avec exists(). Pour uniformiser un path faudrait voir la fonction File().toURI(). Si non, gérer comlètement les comparaisons avec toUpper() - toLower(). Voir aussi l'interface Comparator

  7. #7
    Expert éminent
    Avatar de adiGuba
    Homme Profil pro
    Développeur Java/Web
    Inscrit en
    Avril 2002
    Messages
    13 938
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France

    Informations professionnelles :
    Activité : Développeur Java/Web
    Secteur : Transports

    Informations forums :
    Inscription : Avril 2002
    Messages : 13 938
    Billets dans le blog
    1
    Par défaut
    Salut,

    Citation Envoyé par spender
    sais-tu si il existe une une api pour avoir toujours qui uniformise un chemin (local ou distant) sur tous les OS? qui donnerait le même résultat niveau code mais dont la jvm se chargerait de transformer en fonction de l'os sous jacent ? ??
    Ben c'est ce que fait la JVM : elle s'adapte aux conventions du systèmes !

    Si sur un système Windows la casse n'a pas d'importance, cela peut être problématique de faire des recherche case-insensitive sur un système Unix, car "Fichier" et "fichier" sont deux fichiers différents (lequel ouvrir alors lorsque l'utilisateur saisie "FICHIER" ?).

    Bref il serait plus simple et plus "portable" de ne pas faire de traitement particulier pour simuler du case-insensitive...

    a++

Discussions similaires

  1. serveur sensible à la casse des noms de fichiers
    Par SpaceFrog dans le forum Apache
    Réponses: 4
    Dernier message: 10/09/2013, 16h59
  2. Réponses: 4
    Dernier message: 21/07/2011, 22h57
  3. ODBC : nom de champ sensible à la casse
    Par Flamenco dans le forum Requêtes et SQL.
    Réponses: 3
    Dernier message: 19/11/2010, 07h52
  4. Réponses: 6
    Dernier message: 03/05/2006, 11h01
  5. Nom de la table sensible à la casse
    Par Alexandre T dans le forum MS SQL Server
    Réponses: 6
    Dernier message: 17/03/2005, 17h34

Partager

Partager
  • Envoyer la discussion sur Viadeo
  • Envoyer la discussion sur Twitter
  • Envoyer la discussion sur Google
  • Envoyer la discussion sur Facebook
  • Envoyer la discussion sur Digg
  • Envoyer la discussion sur Delicious
  • Envoyer la discussion sur MySpace
  • Envoyer la discussion sur Yahoo