Comment gérer une exception UnauthorizedAccessException lorsque vous essayez d’append des fichiers depuis un emplacement sans permissions

J’essaie d’obtenir tous les fichiers du dossier de cette façon:

try { ssortingng[] files = Directory.GetFiles(folderBrowserDialog1.SelectedPath, "*.*", SearchOption.AllDirectories); } catch (UnauthorizedAccessException) { throw; } 

Si mon dossier racine contient un dossier pour lequel l’utilisateur n’a pas l’autorisation d’access, l’ UnauthorizedAccessException est interceptée, mon tableau est vide et toute la récursion a échoué.

Comment puis-je gérer ce cas et m’assurer que mon code ignore les emplacements sans autorisation mais ajoute les fichiers d’emplacement avec des permissions?

voir SafeFileEnumerator sur cet autre article. J’ai déjà utilisé le code SafeFileEnumerator avec succès. Cela évite de perdre la totalité de l’énumération lorsque vous n’avez simplement pas access à un seul fichier, ce qui vous permet de parcourir les fichiers auxquels vous avez access.

EDIT: La version que j’ai est légèrement différente de celle à laquelle j’ai lié, alors laissez-moi partager la version que j’ai.

 public static class SafeFileEnumerator { public static IEnumerable EnumerateDirectories(ssortingng parentDirectory, ssortingng searchPattern, SearchOption searchOpt) { try { var directories = Enumerable.Empty(); if (searchOpt == SearchOption.AllDirectories) { directories = Directory.EnumerateDirectories(parentDirectory) .SelectMany(x => EnumerateDirectories(x, searchPattern, searchOpt)); } return directories.Concat(Directory.EnumerateDirectories(parentDirectory, searchPattern)); } catch (UnauthorizedAccessException ex) { return Enumerable.Empty(); } } public static IEnumerable EnumerateFiles(ssortingng path, ssortingng searchPattern, SearchOption searchOpt) { try { var dirFiles = Enumerable.Empty(); if (searchOpt == SearchOption.AllDirectories) { dirFiles = Directory.EnumerateDirectories(path) .SelectMany(x => EnumerateFiles(x, searchPattern, searchOpt)); } return dirFiles.Concat(Directory.EnumerateFiles(path, searchPattern)); } catch (UnauthorizedAccessException ex) { return Enumerable.Empty(); } } } 

Exemple d’utilisation:

 foreach(ssortingng fileName in SafeFileEnumerator.EnumerateFiles(folderPath, "*" + extension, SearchOption.AllDirectories)) { //Do something with filename, store into an array or whatever you want to do. } 

Vous pouvez utiliser les objects FileSystemInfo et la récursivité pour accomplir ceci:

 static List files = new List(); static void MyMethod() { DirectoryInfo dir = new DirectoryInfo(folderBrowserDialog1.SelectedPath); ProcessFolder(dir.GetFileSystemInfos()); } static void ProcessFolder(IEnumerable fsi) { foreach (FileSystemInfo info in fsi) { // We skip reparse points if ((info.Atsortingbutes & FileAtsortingbutes.ReparsePoint) == FileAtsortingbutes.ReparsePoint) { Debug.WriteLine("Skipping reparse point '{0}'", info.FullName); return; } if ((info.Atsortingbutes & FileAtsortingbutes.Directory) == FileAtsortingbutes.Directory) { // If our FileSystemInfo object is a directory, we call this method again on the // new directory. try { DirectoryInfo dirInfo = (DirectoryInfo)info; ProcessFolder(dirInfo.GetFileSystemInfos()); } catch (Exception ex) { // Skipping any errors // Really, we should catch each type of Exception - // this will catch -any- exception that occurs, // which may not be the behavior we want. Debug.WriteLine("{0}", ex.Message); break; } } else { // If our FileSystemInfo object isn't a directory, we cast it as a FileInfo object, // make sure it's not null, and add it to the list. var file = info as FileInfo; if (file != null) { files.Add(file.FullName); } } } } 

MyMethod prend votre chemin sélectionné et crée un object DirectoryInfo avec celui-ci, puis appelle la méthode GetFileSystemInfos() et le transmet à la méthode ProcessFolder .

La méthode ProcessFolder examine chaque object FileSystemInfo , ignore les points d’parsing et, si l’object FileSystemInfo est un répertoire, appelle à nouveau la méthode ProcessFolder . Sinon, elle jette l’object FileSystemInfo tant qu’object FileInfo , puis s’assure qu’elle n’est pas nulle. le nom de fichier à la liste.

Plus de lecture:

  • Classe FileSystemInfo
  • Classe DirectoryInfo
  • Classe FileInfo