2016-05-18 8 views
1

Bitte, hilf mir! Ich habe ein Problem. Code:DirectoryInfo.GetFiles() Fehler: System.UnathorizedAccessException

...  
currentDirectory = new DirectoryInfo(absoluteCurrentPath); 
FileInfo[] allFiles = currentDirectory.GetFiles("*", SearchOption.AllDirectories); 
model.AllFiles = new List<MyFile>(); 
foreach (var f in allFiles) 
{ 

    model.AllFiles.Add(new MyFile(f.Name, f.FullName, Utilites.ConvertBytesToMegabytes(f.Length))); 
} 

Wenn DirectoryInfo CurrentDirectory = "C:\\" oder anderes Verzeichnis mit Systemdateien entsprechen, dann außer Fehler: System.UnathorizedAccessException. Wenn ich einen Block try-catch nehme, überspringt es nur GetFiles(). Wie kann ich alle Dateien abrufen und nur Systemdateien überspringen oder alle Dateien ohne Überspringen von Dateien abrufen? Danke!

+0

In welchem ​​Fenster führen Sie Ihr Projekt aus? Ich habe gesehen, dass Sie nicht die Erlaubnis haben, direkt auf 'C' Disk –

Antwort

2

Es gibt eine Methode, die ich vor einiger Zeit schrieb:

public static IEnumerable<FileInfo> EnumerateFiles(string path, string searchPattern = null) 
{ 
    searchPattern = searchPattern ?? "*"; 

    var queue = new Queue<string>(); 

    queue.Enqueue(path); 

    do 
    { 
     path = queue.Dequeue(); 

     foreach (var file in SafeEnumerateFiles(path, searchPattern)) 
     { 
      yield return new FileInfo(file); 
     } 

     foreach (var directory in SafeEnumerateDirectories(path)) 
     { 
      queue.Enqueue(directory); 
     } 
    } 
    while (queue.Any()); 
} 

static IEnumerable<string> SafeEnumerateFiles(string path, string searchPattern) 
{ 
    try 
    { 
     return Directory.EnumerateFiles(path, searchPattern); 
    } 
    catch (DirectoryNotFoundException) { } 
    catch (SecurityException) { } 
    catch (UnauthorizedAccessException) { } 

    return Enumerable.Empty<string>(); 
} 

static IEnumerable<string> SafeEnumerateDirectories(string path) 
{ 
    try 
    { 
     return Directory.EnumerateDirectories(path); 
    } 
    catch (DirectoryNotFoundException) { } 
    catch (SecurityException) { } 
    catch (UnauthorizedAccessException) { } 

    return Enumerable.Empty<string>(); 
} 

Die Methode überspringt Ordner, den Sie nicht über die Berechtigung verfügen.

+0

zuzugreifen. Sie meinen, überspringt die Ordner, die Sie nicht haben oder ein Sicherheitsproblem auftritt und schluckt die Ausnahme. Ich persönlich mag nicht die Idee, nur Ausnahmen zu verschlucken. –

+0

Mit IO ist etwas, was Sie akzeptieren müssen, werfen Sie einen Blick auf [this] (https://blogs.msdn.microsoft.com/ericlippert/2008/09/10/vexing-exceptions/). –

+0

Das ist ein fairer Punkt. –