LoginSignup
1
2

More than 5 years have passed since last update.

EnumerateFiles(?, ?, AllDirectories) メソッドで、アクセス権エラーを回避する

Posted at

はじめに

System.IO.Directory.EnumerateFiles メソッドは、引数にSearchOption.AllDirectories を指定すると、指定したディレクトリの内部にあるファイルをサブディレクトリを含めて検索して返してくれて便利です。
しかし、ディレクトリ内部にフォルダ一覧化のアクセス権がないディレクトリがあると、System.UnauthorizedAccessExceptionSystem.例外が発生してしまいます。

解決例

自前でEnumerateFilesメソッドを作成してみました。
自分で階層を探ります。IEnumerable<string> 型で返し、GetFilesメソッドのように全部走査し終わるまで待たされることもありません。

コード

using System;
using System.Collections.Generic;
using System.Linq;

namespace SampleProject
{
    public class Directory
    {
        public static IEnumerable<string> SafeEnumerateFilesInAllDirectories(string path)
        {
            return SafeEnumerateFilesInAllDirectories(path, "*");
        }

        public static IEnumerable<string> SafeEnumerateFilesInAllDirectories(string path, string searchPattern)
        {
            var files = Enumerable.Empty<string>();
            try
            {
                files = System.IO.Directory.EnumerateFiles(path, searchPattern);
            }
            catch(System.UnauthorizedAccessException)
            {
            }
            try
            {
                files = System.IO.Directory.EnumerateDirectories(path)
                    .Aggregate<string, IEnumerable<string>>(
                        files,
                        (a, v) => a.Union(SafeEnumerateFilesInAllDirectories(v, searchPattern))
                    );
            }
            catch (System.UnauthorizedAccessException)
            {
            }

            return files;
        }
    }
}

参考にしたサイト 感謝!

1
2
0

Register as a new user and use Qiita more conveniently

  1. You get articles that match your needs
  2. You can efficiently read back useful information
  3. You can use dark theme
What you can do with signing up
1
2