75 votes

Ignorer les fichiers/dossiers lorsque le Répertoire.GetFiles() l'accès est refusé

J'essaie d'afficher une liste de tous les fichiers trouvés dans le répertoire sélectionné (et éventuellement les sous-répertoires). Le problème que j'ai est que lorsque le GetFiles() la méthode est livré dans un dossier qu'il ne peut pas y accéder, il déclenche une exception et le processus s'arrête.

Comment puis-je ignorer cette exception (et ignorer le protégé de dossiers/fichiers) et continuer d'ajouter des fichiers accessibles à la liste?

try
{
    if (cbSubFolders.Checked == false)
    {
        string[] files = Directory.GetFiles(folderBrowserDialog1.SelectedPath);
        foreach (string fileName in files)
            ProcessFile(fileName);
    }
    else
    {
        string[] files = Directory.GetFiles(folderBrowserDialog1.SelectedPath, "*.*", SearchOption.AllDirectories);
        foreach (string fileName in files)
            ProcessFile(fileName);
    }
    lblNumberOfFilesDisplay.Enabled = true;
}
catch (UnauthorizedAccessException) { }
finally {}

48voto

Marc Gravell Points 482669

Vous aurez à faire de la récursivité manuellement; ne pas utiliser AllDirectories - chercher un dossier à la fois, alors essayez de récupérer les fichiers des sous-répertoires. Pas testé, mais quelque chose comme ci-dessous (notez utilise un délégué plutôt que de construire un tableau):

using System;
using System.IO;
static class Program
{
    static void Main()
    {
        string path = ""; // TODO
        ApplyAllFiles(path, ProcessFile);
    }
    static void ProcessFile(string path) {/* ... */}
    static void ApplyAllFiles(string folder, Action<string> fileAction)
    {
        foreach (string file in Directory.GetFiles(folder))
        {
            fileAction(file);
        }
        foreach (string subDir in Directory.GetDirectories(folder))
        {
            try
            {
                ApplyAllFiles(subDir, fileAction);
            }
            catch
            {
                // swallow, log, whatever
            }
        }
    }
}

14voto

Ben Gripka Points 4885

Cette fonction simple qui fonctionne bien et répond aux questions des exigences.

private List<string> GetFiles(string path, string pattern)
{
    var files = new List<string>();

    try 
    { 
        files.AddRange(Directory.GetFiles(path, pattern, SearchOption.TopDirectoryOnly));
        foreach (var directory in Directory.GetDirectories(path))
            files.AddRange(GetFiles(directory, pattern));
    } 
    catch (UnauthorizedAccessException) { }

    return files;
}

2voto

Malcolm Points 621

voir http://stackoverflow.com/a/10728792/89584 pour une solution qui gère le UnauthorisedAccessException problème.

Toutes les solutions ci-dessus va manquer des fichiers et/ou répertoires, si tous les appels à GetFiles() ou GetDirectories() sont sur les dossiers avec un mélange d'autorisations.

1voto

user25306 Points 185

Cela devrait répondre à la question. J'ai ignoré le problème de passer par des sous-répertoires, je suis en supposant que vous avez compris.

Bien sûr, vous n'avez pas besoin d'avoir une autre méthode pour cela, mais vous risquez de vous trouver une place utile pour vérifier le chemin d'accès est valide, et de traiter avec les autres exceptions que vous pourriez rencontrer lors de l'appel de GetFiles().

Espérons que cette aide.

private string[] GetFiles(string path)
{
    string[] files = null;
    try
    {
       files = Directory.GetFiles(path);
    }
    catch (UnauthorizedAccessException)
    {
       // might be nice to log this, or something ...
    }

    return files;
}

private void Processor(string path, bool recursive)
{
    // leaving the recursive directory navigation out.
    string[] files = this.GetFiles(path);
    if (null != files)
    {
        foreach (string file in files)
        {
           this.Process(file);
        }
    }
    else
    {
       // again, might want to do something when you can't access the path?
    }
}

Prograide.com

Prograide est une communauté de développeurs qui cherche à élargir la connaissance de la programmation au-delà de l'anglais.
Pour cela nous avons les plus grands doutes résolus en français et vous pouvez aussi poser vos propres questions ou résoudre celles des autres.

Powered by:

X