2016-05-18 2 views
1

お願いします!私は問題があります。 コード:DirectoryInfo.GetFiles()エラー: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))); 
} 

DirectoryInfo CurrentDirectory = "C:\\"かは、エラーを除いて、システムファイルと他のディレクトリに等しい:System.UnathorizedAccessExceptionを。 ブロックtry-catchを取ると、GetFiles()をスキップするだけです。 どのようにすべてのファイルを取得し、システムファイルのみをスキップするか、ファイルをスキップせずにすべてのファイルを取得できますか? ありがとう!

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>(); 
} 

方法は、あなたが権限を持っていないフォルダはスキップ:私はいくつかの時間前に書いた方法があり

+0

あなたはあなたのプロジェクトを実行していますか?私はあなたが直接 'C'ディスクにアクセスする許可を持っていないことを知っていた –

答えて

2

+0

あなたは、あなたが許可を持っていないフォルダをスキップするか、セキュリティ上の問題が発生し、例外を呑み込む。 私は個人的に例外を飲み込むという考えが嫌いです。 –

+0

IOでは、受け入れなければならないものがあります。[this](https://blogs.msdn.microsoft.com/ericlippert/2008/09/10/vexing-exceptions/)をご覧ください。 –

+0

それは公正な点です。 –

関連する問題