2015-03-07 2 views
1

de Windows a un certain nombre de répertoires qui ont des noms de temps anciens et ne sont pas accessibles. Je veux dire des répertoires comme "C: \ Documents and Settings" et "C: \ Dokumente und Einstellungen" où le vrai dossier est "C: \ Users". Un autre est "C: \ Program" sur les systèmes localisés. Ces répertoires apparaissent lors de l'itération de tous les répertoires avec Directory.GetDirectories mais ne sont pas accessibles. Lorsque vous essayez d'y accéder, un UnauthorizedAccessException est lancé. Je pourrais l'attraper, mais cela occasionne du temps supplémentaire qui ralentit mon balayage. Je préfère éviter de regarder dans ces faux répertoires en premier lieu. (Je me demande pourquoi ils sont encore là et si je pourrais juste les supprimer, mais c'est une autre question.)Circuler répertoires de liens de compatibilité de Windows 7

Alors, quelle est une bonne façon de détecter de tels pièges avant de tomber dans eux? Je suppose que c'est une sorte de lien, mais il existe différents types de liens (et des trucs du NTFS qu'aucun utilisateur mondain ne peut créer lui-même) et je ne saurais toujours pas comment le détecter à partir du code.

Je sais que je dois encore gérer cette exception, mais si je sais déjà à l'avance que l'opération ne fonctionne pas, je voudrais pas le faire pour garder les choses rapidement. Les analyses de disque sont déjà assez lentes.

Mon code n'est pas censé fonctionner avec des privilèges d'administrateur, ni ESPÉRANT trouver quelque chose d'utile dans ces répertoires liés.

+0

Attraper l'exception peut causer plus de temps, mais que cela a _serious_ impact sur votre temps d'exécution? Il est tout à fait possible que le code dont vous avez besoin pour éviter cela coûte plus cher que d'accepter simplement que vous devrez gérer l'exception. – Ceisc

+0

Il ya un ACE tout le monde dans la liste DACL qui empêche de les répertorier. Mais ils peuvent toujours être traversés, par ex. 'dir"% SystemDrive% \ Documents and Settings \% USERNAME% "'. – eryksun

+1

Restez à l'écart de tout répertoire ayant les attributs Hidden et System. –

Répondre

2

DirectoryInfo.FileAttributes contient l'attribut ReparsePoint dans le cas d'un dossier lié symbolique:

// Code from LinqPad, not sure it compiles in IDE: 
DirectoryInfo di = new DirectoryInfo(@"c:\documents and settings"); 
Console.WriteLine("{0}", di.Attributes); // Hidden, System, Directory, ReparsePoint, NotContentIndexed 
+0

Mais, le PO voudrait-il sauter tous les points de reparse, ou juste certains d'entre eux que Microsoft a créés? Je parie que d'autres points de reparse seraient bien de descendre. – dsolimano

+0

Je ne sais pas, je ne l'ai jamais sciemment créé un point d'analyse pour moi-même ou les vu utilisés dans la pratique pour quoi que ce soit à côté de ces types de dossiers .... crénelage –

+0

Je les ai largement utilisé pour monter des volumes à l'intérieur d'autres volumes, déplacer les données des sous-programmes avec des chemins codés en dur, et pour les déploiements de logiciels avec une restauration facile dans mon environnement de production. Si OP écrit un logiciel pour lui-même, il pourrait ignorer les points de reparse, mais s'il vend des logiciels à d'autres, je serais énervé si cela ne fonctionnait pas dans mon environnement parce que j'utilisais une fonction de système de fichiers assez basique. – dsolimano

1

Si la performance est votre objectif, vous pourriez faire mieux que les dossiers récursive itération - vous pouvez lire le MFT directement. Ce n'est pas béatement simple, mais c'est vraiment rapide. Voici un tutorial pour faire le sale boulot si vous êtes intéressé.

+0

Approche intéressante, je l'ai mis sur ma liste de choses à essayer. – ygoe