C#
.NET
.NETFramework

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

はじめに

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

参考にしたサイト 感謝!