2012-02-17

GetFiles, GetDirectories, EnumerateDirectories, EnumerateFiles - UnauthorizedAccessException

Funkcje służąca do wyliczenia plików i katalogów w połączeniu z parametrem SearchOption.AllDirectories (a być może także bez niego) mają jedną wadę potrafią zwrócić wyjątek UnauthorizedAccessException, w przypadku katalogu do którego nie mamy praw. Najgorzej wygląda to właśnie podczas rekurencyjnego przeszukiwania całego drzewa. Jeśli gdzieś w tym drzewie jest plik/katalog do którego nie mamy praw to dostaniemy ten wyjątek.

Wydaje się, że powinno to zostać trochę bardziej elegancko rozwiązane. W praktyce oznacza to, że na podanych wyżej funkcjach nie można polegać. Bo taki katalog/plik może trafić się wszędzie.

Przy czym nie jestem pewien czy bardziej nie chodzi tutaj o katalogi niż o pliki. Tego nie sprawdzałem.

Moja wersja zwracająca wszystkie pliki w w drzewie katalogu i pomijająca te do których nie mamy praw:

public static void GetFiles(DirectoryInfo a_dir, List<string> a_files)
{
    try
    {
        foreach (var file in a_dir.GetFiles())
            a_files.Add(file.FullName);
    }
    catch
    {
        System.Console.WriteLine("dir ex: {0}", a_dir.FullName);
    }

    try
    {
        foreach (var dir in a_dir.GetDirectories())
            GetFiles(dir, a_files);
    }
    catch (UnauthorizedAccessException)
    {
        System.Console.WriteLine("dir2 ex: {0}", a_dir.FullName);
    }
}

Brak komentarzy:

Prześlij komentarz