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

Java Discussion :

Savoir si un répertoire est caché dans quelque part dans un chemin


Sujet :

Java

  1. #1
    Nouveau membre du Club
    Profil pro
    Inscrit en
    Mars 2011
    Messages
    81
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Mars 2011
    Messages : 81
    Points : 36
    Points
    36
    Par défaut Savoir si un répertoire est caché dans quelque part dans un chemin
    Bonjour,

    Je voudrais savoir si un des dossiers de ce chemin est caché (peut importe lequel) : "D:/MonRepertoire/rep/test/MonFichier.txt"

    Pour cela, je test si mon fichier est caché, si non je regarde si le répertoire père est caché, sinon je regarde si le répertoire père est caché... et ainsi de suite jusqu'à la racine. Voici mon code :
    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
    public static boolean isPathHidden(Path path)
    {
    	boolean bool = false;
    	while (!path.equals(null) || bool==false){
    		System.out.println(path.toAbsolutePath());
    		if (path.toFile().isHidden()){
    			bool = true;
    		}
    		else {
    			path = path.getParent();
    		}
    	}
    	return bool;
    }
     
    public static void main(String args[]) {
    	Path path = Paths.get("D:\\MonRepertoire\\rep\\test\\MonFichier.txt");
    	if (isPathHidden (path)){
    		System.out.println(path.toAbsolutePath()+" a une repertoire caché dans son chemin");
    	}
    	else {
    		System.out.println(path.toAbsolutePath()+" ne contient aucun répertoire caché dans son chemin");
    	}
    }
    Je ne vois pas d'ou vient l'erreur, en console ça boucle sur la racine :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    D:\MonRepertoire\rep\test\MonFichier.txt
    D:\MonRepertoire\rep\test
    D:\MonRepertoire\rep
    D:\MonRepertoire
    D:\
    D:\
    D:\
    D:\
    ...
    Quelqu'un voit ou est l'erreur ?

  2. #2
    Membre chevronné
    Inscrit en
    Mai 2006
    Messages
    1 364
    Détails du profil
    Informations forums :
    Inscription : Mai 2006
    Messages : 1 364
    Points : 1 984
    Points
    1 984
    Par défaut
    Oui, c'est parce que tu fais une boucle while alors que tu utilises ta méthode comme une méthode recursive. Et comme ta méthode utilise une variable "path" de l'objet (ce qui est tres moche dans ce cas), tu te retrouves avec beaucoup plus de traces que prévu. En plus, ton programme part en boucle infinie car si aucun repertoire caché, bool sera toujours false. Et si un repertoire est trouvé, path ne sera jamais null... Or d'apres la condition du while, il faudrait que path soit null ET que bool == true pour arreter...

    Il faudrait plutot faire un truc du genre :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
    14
    Path getHiddenPath(Path path)
    {
       Path ret = null;
       if(path != null)
       {
          if (path.toFile().isHidden())
          {
             ret =path;
          }
          else
             ret = getHiddenPath(path.getParent());
       }
       return ret;
    }

    PS : path.equals(null) => ne sera jamais vrai car si path == null => tu auras une exception...

  3. #3
    Expert éminent sénior
    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
    Points : 23 190
    Points
    23 190
    Billets dans le blog
    1
    Par défaut
    Salut,


    @hwoarang : en règle général il est préférable d'utiliser une boucle iteratif à une méthode recursif.


    A mon avis le problème vient de getParent(). Sous Windows l'emplacement root a toujours un parent : lui-même. Donc effectivement ca risque de boucler longtemps puisque getParent() ne sera jamais null...

    Il faut donc tester le cas pour stopper le traitement :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
    public static boolean isPathHidden(Path path) {
     
    	while (path!=null) {
    		if (Files.isHidden(path))
    			return true;
    		Path parent = Path.getParent();
    		if ( parent!=null && Files.isSameFile(path, parent) ) {
    			parent = null;
    		}
    		path = parent;
    	}
    	return false;
    }
    a++

    PS : @BobbyWeb : c'est drôle tu continues à mélanger Path & File ! Utilises l'un ou l'autre

  4. #4
    Nouveau membre du Club
    Profil pro
    Inscrit en
    Mars 2011
    Messages
    81
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Mars 2011
    Messages : 81
    Points : 36
    Points
    36
    Par défaut
    @adiGuba : Merci pour cette correction. Néanmoins, cela ne fonctionne toujours pas.

    Voici le code final (j'ai juste rajouté throws IOException, éclipse détecté une erreur):
    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
    public static boolean isHiddenPath(Path path) throws IOException
    {
     
    	while (path!=null) 
    	{
    		System.out.println(path.toAbsolutePath());
    		if (Files.isHidden(path))
    		{
    			return true;
    		}
    		Path parent = path.getParent();
    		if ( parent!=null && Files.isSameFile(path, parent) ) 
    		{
    			parent = null;
    		}
    		path = parent;
    	}
    	return false;
    }
     
    public static void main(String args[]) throws InterruptedException 
    {
    	try{
    		Path path = Paths.get("D:\\AAA\\BBB\\CCC\\DDD\\MonFichier.txt");
    		if (isHiddenPath (path)){
    			System.out.println(path.toAbsolutePath()+" a une repertoire caché dans son chemin");
    		}
    		else {
    			System.out.println(path.toAbsolutePath()+" ne contient aucun répertoire caché dans son chemin");
    		}
    	}
    	catch (Exception e) {}
    }
    Ici, mon répertoire "CCC" est caché, voici pourtant les messages de la console :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    D:\AAA\BBB\CCC\DDD\MonFichier.txt
    D:\AAA\BBB\CCC\DDD
    D:\AAA\BBB\CCC
    D:\AAA\BBB
    D:\AAA
    D:\
    D:\AAA\BBB\CCC\DDD\MonFichier.txt ne contient aucun répertoire caché dans son chemin
    Je vois pas ou est le problème pourtant...

    Citation Envoyé par adiGuba Voir le message
    PS : @BobbyWeb : c'est drôle tu continues à mélanger Path & File ! Utilises l'un ou l'autre
    ps : Oui, je découvre Java 7 et donc java.nio.file c'est pour ça

  5. #5
    Modérateur

    Profil pro
    Inscrit en
    Septembre 2004
    Messages
    12 551
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Septembre 2004
    Messages : 12 551
    Points : 21 607
    Points
    21 607
    Par défaut
    Ça m'avait tout l'air d'une limitation de Files.isHidden(), et je suis allé voir sa JavaDoc.
    Ce serait une bonne idée que tu le fasses aussi.
    N'oubliez pas de consulter les FAQ Java et les cours et tutoriels Java

  6. #6
    Expert éminent sénior
    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
    Points : 23 190
    Points
    23 190
    Billets dans le blog
    1
    Par défaut
    Citation Envoyé par BobbyWeb Voir le message
    Je vois pas ou est le problème pourtant...
    Quand on a un problème de ce genre, le plus simple est de regarder la doc : http://download.oracle.com/javase/7/...o.file.Path%29
    Pour une raison qui m'échappe, sous Windows Files.isHidden() ne vérifie que les fichiers simples et pas les répertoires :
    On Windows a file is considered hidden if it isn't a directory and the DOS hidden attribute is set.

    Il faut donc vérifier explicitement cela dans le cas d'un système DOS, via une méthode isHiddenDirectory() :
    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
    	private static boolean isHiddenDirectory(Path path) throws IOException {
    		if (Files.isHidden(path))
    			return true;
    		if (Files.isDirectory(path) && Files.getFileStore(path).supportsFileAttributeView(DosFileAttributeView.class)) {
    			DosFileAttributes dos = Files.readAttributes(path, DosFileAttributes.class);
    			return dos.isHidden();
    		}
    		return false;
    	}
     
    	public static boolean isHiddenPath(Path path) throws IOException {
    		path = path.toAbsolutePath();
     
    		while (path != null) {
    			if (isHiddenDirectory(path)) {
    				return true;
    			}
    			Path parent = path.getParent();
    			if (parent != null && Files.isSameFile(path, parent)) {
    				parent = null;
    			}
    			path = parent;
    		}
    		return false;
    	}

    a++

  7. #7
    Nouveau membre du Club
    Profil pro
    Inscrit en
    Mars 2011
    Messages
    81
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Mars 2011
    Messages : 81
    Points : 36
    Points
    36
    Par défaut
    Merci, ce détail m'avait échappé.

    Néanmoins, cela ne fonctionne toujours pas :
    Si il n'y a aucun fichier caché voici la console :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    D:\AAA\BBB\CCC\DDD\MonFichier.txt
    D:\AAA\BBB\CCC\DDD
    D:\AAA\BBB\CCC
    D:\AAA\BBB
    D:\AAA
    D:\
    D:\AAA\BBB\CCC\DDD\MonFichier.txt a un repertoire caché dans son chemin
    Et si je met le dossier CCC en caché, voici la console :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    D:\AAA\BBB\CCC\DDD\MonFichier.txt
    D:\AAA\BBB\CCC\DDD
    D:\AAA\BBB\CCC
    D:\AAA\BBB\CCC\DDD\MonFichier.txt a un repertoire caché dans son chemin
    Le code semble fonctionner, il s'arrête bien lorsqu'il voit un fichier ou répertoire caché. Mais la fonction renvoi toujours true...

    Je pense que le problème vient de la lignequi renvoie toujours "true" .

  8. #8
    Membre chevronné
    Inscrit en
    Mai 2006
    Messages
    1 364
    Détails du profil
    Informations forums :
    Inscription : Mai 2006
    Messages : 1 364
    Points : 1 984
    Points
    1 984
    Par défaut
    Citation Envoyé par adiGuba Voir le message
    @hwoarang : en règle général il est préférable d'utiliser une boucle iteratif à une méthode recursif.
    Je sais bien mais le code de départ étant recursif, je suis resté dans le meme esprit. D'autant qu'il faut reconnaitre que le recursif a l'avantage d'etre simple à comprendre (meme si on est d'accord, l'itératif est mieux)...

  9. #9
    Expert éminent sénior
    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
    Points : 23 190
    Points
    23 190
    Billets dans le blog
    1
    Par défaut
    Citation Envoyé par BobbyWeb Voir le message
    Je pense que le problème vient de la ligne return dos.isHidden(); qui renvoie toujours "true" .
    En effet... les "roots" doivent être considérés comme "hidden" (ce ne sont pas des vrais dossiers après tout). Bref il ne faut pas traiter le répertoire root :

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
    	public static boolean isHiddenPath(Path path) throws IOException {
    		// on passage on récupère le chemin absolu et on le normalize, afin de le parcourir normalement dans tous les cas :
    		path = path.toAbsolutePath().normalize();
     
    		while (Files.isSameFile(path, path.getRoot())==false) {
    			System.out.println(path);
    			if (isHiddenDirectory(path)) {
    				return true;
    			}
    			path = path.getParent();
    		}
    		return false;
    	}

    a++


    [edit] hwoarang : le recursif est plus simple à écrire... mais pas forcément à comprendre. L'itératif est assez simple à lire dans ces cas comme celui là...

  10. #10
    Nouveau membre du Club
    Profil pro
    Inscrit en
    Mars 2011
    Messages
    81
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Mars 2011
    Messages : 81
    Points : 36
    Points
    36
    Par défaut
    Bravo adiGuba, ça marche à la perfection !

+ Répondre à la discussion
Cette discussion est résolue.

Discussions similaires

  1. savoir si un repertoire est caché ou pas?
    Par zalalus dans le forum Macros et VBA Excel
    Réponses: 1
    Dernier message: 17/09/2010, 14h36
  2. Comment savoir si un fichier est caché ?
    Par IP-Fix dans le forum Général Python
    Réponses: 2
    Dernier message: 14/05/2008, 18h18
  3. Comment savoir si un répertoire est vide
    Par mundu dans le forum Général Python
    Réponses: 5
    Dernier message: 06/05/2008, 11h51
  4. [C#] Savoir si un fichier est caché
    Par Oberown dans le forum C#
    Réponses: 1
    Dernier message: 19/12/2005, 17h06
  5. Réponses: 4
    Dernier message: 15/12/2003, 17h46

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