Répertoire.EnumerateFiles => UnauthorizedAccessException

Il y a une bonne nouvelle méthode .NET 4.0 pour récupérer des fichiers dans un répertoire en continu, par l'énumération.

Le problème ici est que si l'on souhaite énumérer tous les fichiers que l'on ne peut savoir à l'avance quels fichiers ou dossiers d'accès sont protégés et peuvent jeter un UnauthorizedAccessException.

À reproduire, on peut simplement exécuter ce fragment:

foreach (var file in Directory.EnumerateFiles(@"c:\", "*", SearchOption.AllDirectories))
{
   //whatever
}

Avant cette .Méthode NETTE existé, il a été possible d'atteindre à peu près le même effet par la mise en œuvre de récursive itérateur sur la chaîne de la matrice de retour des méthodes. Mais ce n'est pas tout à fait aussi paresseux que le nouveau .Méthode NETTE.

Alors que faire? Peut le UnauthorizedAccessException être supprimée ou est un fait de la vie lors de l'utilisation de cette méthode?

Me semble que la méthode doit avoir une surcharge d'accepter une action pour traiter toutes les exceptions.

  • Oui, votre méthode Dump() doit faire face à des problèmes avec les fichiers qu'il essaie de vidage. Donner une surcharge.
  • Ce n'est pas mon problème Hans. Le problème est que foreach-ing sur le fichier itérateur (EnumerateFiles) provoque une UnauthorizedAccessException et qui à son tour s'arrête plus de l'énumération, qui n'est pas souhaitable lorsque l'on veut exhaustive ensemble de résultats.
  • Le Dump() méthode n'est pas le problème ici, c'est juste des promenades à travers la chaîne de l'énumération. Le problème est le Directory.EnumerateFiles méthode elle-même. Et je ne pense pas qu'il y est un moyen de gérer le problème. Vous devez recourir à SearchOption.TopDirectoryOnly et de gérer la récursivité vous-même, je crois.
  • Il y a une simple solution de contournement. Elle suce bien...
  • Ce (et pour d'autres raisons) est pourquoi j'ai finalement fini par écrire un wrapper pour NtQueryDirectoryFile moi-même.
  • Je me demandais si vous pouviez poster une réponse?
  • Je peux, mais il faut vérifier en premier. Pas convaincu que cela sera effectivement le travail.
  • J'ai posté une solution à ce stackoverflow.com/questions/13130052/.... La solution que j'ai posté se comporte comme un vrai IEnumerable dans le sens qu'il ne fonctionne si il ya du travail qui lui est demandé.