尝试从没有权限的位置添加文件时如何处理UnauthorizedAccessException

use*_*944 13 c#

我试图以这种方式从文件夹中获取所有文件:

try
{
    string[] files = Directory.GetFiles(folderBrowserDialog1.SelectedPath, "*.*", SearchOption.AllDirectories);
}
catch (UnauthorizedAccessException)
{
    throw;
}
Run Code Online (Sandbox Code Playgroud)

如果我的根文件夹包含用户无权访问的文件夹,UnauthorizedAccessException则会捕获该文件夹并且我的数组为空并且所有递归都失败.

我如何处理这种情况并确保我的代码在没有权限的情况下忽略位置但是从具有权限的位置添加文件?

Aar*_*ins 17

请参阅另一篇文章中的SafeFileEnumerator.我过去使用过SafeFileEnumerator代码并取得了成功.当您只是无法访问单个文件时,它可以防止丢失整个枚举,因此您仍然可以遍历可以访问的文件.

编辑:我的版本与我链接的版本略有不同,所以让我分享我的版本.

public static class SafeFileEnumerator
{
    public static IEnumerable<string> EnumerateDirectories(string parentDirectory, string searchPattern, SearchOption searchOpt)
    {
        try
        {
            var directories = Enumerable.Empty<string>();
            if (searchOpt == SearchOption.AllDirectories)
            {
                directories = Directory.EnumerateDirectories(parentDirectory)
                    .SelectMany(x => EnumerateDirectories(x, searchPattern, searchOpt));
            }
            return directories.Concat(Directory.EnumerateDirectories(parentDirectory, searchPattern));
        }
        catch (UnauthorizedAccessException ex)
        {
            return Enumerable.Empty<string>();
        }
    }

    public static IEnumerable<string> EnumerateFiles(string path, string searchPattern, SearchOption searchOpt)
    {
        try
        {
            var dirFiles = Enumerable.Empty<string>();
            if (searchOpt == SearchOption.AllDirectories)
            {
                dirFiles = Directory.EnumerateDirectories(path)
                                    .SelectMany(x => EnumerateFiles(x, searchPattern, searchOpt));
            }
            return dirFiles.Concat(Directory.EnumerateFiles(path, searchPattern));
        }
        catch (UnauthorizedAccessException ex)
        {
            return Enumerable.Empty<string>();
        }
    }
}
Run Code Online (Sandbox Code Playgroud)

用法示例:

foreach(string fileName in SafeFileEnumerator.EnumerateFiles(folderPath, "*" + extension, SearchOption.AllDirectories))
{
    //Do something with filename, store into an array or whatever you want to do.
}
Run Code Online (Sandbox Code Playgroud)