2010-07-01 7 views
3

La méthode File.listFiles() répertorie le contenu d'un dossier. Sur les fenêtres cependant, quand vous appelez la méthode sur votre disque racine, cela donne aussi - en l'absence de meilleure expression - des dossiers "virtuels" (comme "Documents and Settings", qui ont été remplacés par "Users" dans les versions récentes de Windows) .File.listFiles() et distinguant les dossiers physiques des dossiers virtuels

Si vous appelez ensuite listFiles() pour l'un de ces dossiers "virtuels", il renvoie toujours null. Et c'est là que se situe mon problème, car je veux parcourir récursivement tous les dossiers. J'ai besoin d'un moyen de filtrer ces dossiers et de préférence pas en vérifiant leurs noms ...

Il y a aussi des dossiers supplémentaires, que l'utilisateur normal ne voit pas (comme "System Volume Information" ou la corbeille dossier pour ce lecteur), et je serais heureux de trouver une méthode de filtrage de ceux-ci ainsi sans blacklisting les noms.

Malheureusement, ces dossiers se comportent exactement comme les dossiers réels. Ce que je cherche est quelque chose comme File.isSystemFolder() -method.

Je suis très reconnaissant pour tout conseil

Répondre

2

Vous pouvez filtrer les dossiers système cachés par des tests si File#isHidden() retours true.

Je ne suis pas sûr des dossiers "virtuels". Je pense que les distinguer est seulement possible avec le New IO 2 qui vient en Java 7. Je vais devoir vérifier cela tout d'abord sur une machine Vista/Win7 (je suis actuellement sur XP).


Mise à jour: Je l'ai fait un test rapide à notre 2K3 Server, les Documents and Settings par défaut retourne également true pour File#isHidden() tandis que utilisateurs ne sont pas. Vous pourriez également utiliser cela.

+0

thx, je vais avec ça maintenant – DeX3

0

Je ne pense pas que vous aurez de la chance avec une méthode File.isSystemFolder, parce que je ne peux pas imaginer qu'il serait facile d'imposer une définition de "dossier système" assez large pour les JVM sur une gamme de systèmes d'exploitation être en mesure de mettre en œuvre correctement et utilement. Comme le suggère Balus, la vérification des dossiers non cachés est un bon début et pourrait suffire à elle seule (puisque cela reproduit ce qu'ils verraient dans un shell d'explorateur). A propos des dossiers "virtuels" - d'abord, êtes-vous sûr qu'ils sont virtuels? Est-ce que C:\Documents and Settings (ou plus tard, C:\Users) n'est pas le vrai chemin canonique pour ce dossier? Si ce n'est pas, alors vous pouvez facilement éliminer ces fenêtres sur les fenêtres en voyant si getCanonicalPath().equals(getAbsolutePath()) (tant que vous êtes prêt pour quelques faux positifs avec . s et .. s superflus).

Si cela ne fonctionne pas, il s'agit simplement d'un dossier normal. Vous devez réfléchir aux propriétés logiques de ces dossiers qui les rendent «virtuelles». Ou en d'autres termes, trouver un prédicat qui peut être exprimé en termes de méthodes sur File qui capture ce que vous voulez filtrer. Même si je ne suis pas sûr maintenant tout à fait ce qui serait et ne correspondrait pas, basé sur votre description en anglais.

+0

Merci pour le conseil, les chemins canoniques et absolus sont les mêmes malheureusement, donc je vais prendre l'approche isHidden(). Peut-être que ce n'est pas un si mauvais choix après tout, car l'utilisateur pourrait vouloir éviter les dossiers cachés ici en premier lieu ^^ – DeX3

Questions connexes