2012-01-29 1 views
3

En Java, je suis en train de lister les fichiers et dossiers dans mon répertoire C:\ et boucle à travers les utilisant: File[] files = new File("C:\\").listFiles();Java trouve un dossier "Documents and Settings" sur Win 7 HP. Je ne vois pas un

Cependant, à ma grande surprise quand je boucle le tableau je trouve que le premier index est C:\Documents and Settings! Pour commencer, je cours Windows 7 Home Premium et je n'ai même pas mis à jour à partir de Windows XP ou quoi que ce soit, mais peu importe ce que je fais, je ne peux pas voir ce dossier sur mon disque, disputer choisir de voir les dossiers cachés!

En outre, comme vous vous en doutez, lorsque vous commencez à utiliser une méthode récursive pour parcourir chaque dossier du lecteur, il lance un NullPointerException dès qu'il essaie de lister les fichiers dans ce répertoire.

Est-ce que quelqu'un sait pourquoi c'est, ou même mieux, comment résoudre le problème? Toute idée est apprécié, merci à l'avance


MISE À JOUR: Je suis maintenant très rapidement établi que C:\Documents and Settiings est un symlink ou « JONCTION », donc savoir par question est: comment puis-je savoir qu'il est un lien symbolique en Java pour que je puisse dire à la boucle for d'en sauter un?

+0

Il est en général une très mauvaise idée de suivre les liens symboliques en traversant les répertoires. Si vous voulez faire cela, vous devez vous assurer de détecter les cycles, sinon vous finirez dans une boucle sans fin.La plupart des outils dans unix (où les liens symboliques sont vus beaucoup plus souvent) par défaut les ignorent .. – Voo

+0

Ah, donc c'est un lien symbolique. C'était en fait une partie de ma question - je ne pouvais pas comprendre pourquoi il apparaissait dans le tableau généré par 'listFiles()' mais je ne pouvais pas le voir dans Windows Explorer. S'il vous plaît voir ma question modifiée. – Andy

+1

L'API du fichier Java original était sévèrement limitée et plutôt déficiente de beaucoup de manières différentes - je ne sais pas comment vous le feriez avec ça. La nouvelle API de fichier Java7 est beaucoup améliorée et vous permet de spécifier des options sur la façon dont les liens symboliques doivent être gérés: [voir ici] (http://docs.oracle.com/javase/tutorial/essential/io/links.html) – Voo

Répondre

2

Ok Je pense que cela mérite une réponse complète ici. Il y a plusieurs choses qui se passent en même temps ici, ce qui le rend un peu plus intéressant qu'à première vue.

Oui Documents and Settings est un lien symbolique sous Vista +, non ce n'est pas le problème que nous avons ici. Le vrai problème est que le dossier a des droits d'accès extrêmement restreints - par défaut, même les administrateurs n'y ont pas accès.

Si on lit le isSymbolicLink javadoc il dit clairement:

false si [...] ne peut être déterminé si le fichier est un lien symbolique ou non

Depuis que nous n » N'ayant aucun droit d'accès au répertoire, nous ne pouvons pas déterminer s'il s'agit d'un lien symbolique ou non. Mais puisque nous essayons alors d'accéder au fichier de toute façon nous obtenons une exception nous disant que nous ne pouvons pas accéder au dossier.

Par conséquent le contrôle correct devrait ressembler à ceci:

if (!Files.isReadable(file) || Files.isSymbolicLink(file)) continue; 
+0

Désolé pour la réponse tardive et merci dieu vous avez posté une réponse complète - merci beaucoup! Il est logique de vérifier que Java peut lire le dossier en premier - même si c'était un lien symbolique, si Java n'a même pas les permissions suffisantes, il ne sert à rien d'essayer, maintenant je me sens stupide de ne pas y penser! Encore une fois merci, je pense que cette question a été très utile sur mon seul compte PS Il va sans dire que ça fonctionne maintenant/ignore parfaitement de tels dossiers! – Andy

1

Je pense que lorsque vous utilisez Windows 7 dans une autre langue que l'anglais, il traduit les noms de dossier dans l'explorateur mais le nom dans le système de fichiers reste le même. Si vous utilisez une autre langue, recherchez le dossier avec le nom dans votre langue. Si non, peu importe.

+1

Merci pour la réponse, mais j'utilise Windows 7 en anglais. Bon à savoir cependant. – Andy

4

Sur mon système Windows 7, "Documents and Settings" est une jonction aux utilisateurs. Votre code devrait probablement vérifier pour voir si l'entrée du répertoire n'est pas un vrai répertoire.

Pour le voir sur votre système, faites un "DIR/AS C: \" à partir de la fenêtre de commande. Vous devriez voir quelque chose comme:

07/14/09 00:08 <JUNCTION>  Documents and Settings [C:\Users] 
+0

D'accord, c'est intéressant, alors que me suggérerais-je pour remédier au code Java et l'empêcher de traiter ce * "JUNCTION" * comme un répertoire à recopier? – Andy

+0

Comme mentionné ci-dessus, utilisez le package Java nio et essayez la méthode Files.isSymbolicLink. – schtever

+1

J'ai implémenté la méthode 'Files.isSymbolicLink()' mais pour une raison quelconque, elle ne détecte pas C: \ Documents and Settings' comme un lien symbolique! Mon instruction 'if' pour continuer ressemble à' if (Files.isSymbolicLink (folder.toPath() && ...) 'et si le bloc else ignore cette boucle! – Andy

Questions connexes