C# 获取文件时发生UnauthorizedAccessException

C# 获取文件时发生UnauthorizedAccessException,c#,winforms,exception,directory,getfiles,C#,Winforms,Exception,Directory,Getfiles,我正在创建一个在文件中发现重复的应用程序。当我搜索以下文件时: try { string[] allFiles = Directory.GetFiles( directoryPath, "*.*", SearchOption.AllDirectories ); for (int i = 0; i < allFiles.Length; i++) { //decisions } } catch (UnauthorizedA

我正在创建一个在文件中发现重复的应用程序。当我搜索以下文件时:

try
{
    string[] allFiles = Directory.GetFiles(
        directoryPath, "*.*", SearchOption.AllDirectories
    );

    for (int i = 0; i < allFiles.Length; i++)
    {
      //decisions
    }
}

catch (UnauthorizedAccessException ex)
{
    MessageBox.Show(ex.Message);
}
试试看
{
字符串[]allFiles=Directory.GetFiles(
directoryPath,“***”,SearchOption.AllDirectories
);
for(int i=0;i
上面说

访问路径“C:\$Recycle.Bin…”他被拒绝了


如果某个文件夹不可访问,则移动到下一个文件夹,但程序的执行会在
目录.GetFiles
方法处停止。

下面是一个可以工作的类:

public static class FileDirectorySearcher
{
    public static IEnumerable<string> Search(string searchPath, string searchPattern)
    {
        IEnumerable<string> files = GetFileSystemEntries(searchPath, searchPattern);

        foreach (string file in files)
        {
            yield return file;
        }

        IEnumerable<string> directories = GetDirectories(searchPath);

        foreach (string directory in directories)
        {
            files = Search(directory, searchPattern);

            foreach (string file in files)
            {
                yield return file;
            }
        }
    }

    private static IEnumerable<string> GetDirectories(string directory)
    {
        IEnumerable<string> subDirectories = null;
        try
        {
            subDirectories = Directory.EnumerateDirectories(directory, "*.*", SearchOption.TopDirectoryOnly);
        }
        catch (UnauthorizedAccessException)
        {
        }

        if (subDirectories != null)
        {
            foreach (string subDirectory in subDirectories)
            {
                yield return subDirectory;
            }
        }
    }

    private static IEnumerable<string> GetFileSystemEntries(string directory, string searchPattern)
    {
        IEnumerable<string> files = null;
        try
        {
            files = Directory.EnumerateFileSystemEntries(directory, searchPattern, SearchOption.TopDirectoryOnly);
        }
        catch (UnauthorizedAccessException)
        {
        }

        if (files != null)
        {
            foreach (string file in files)
            {
                yield return file;
            }
        }
    }
}
公共静态类FileDirectorySearcher
{
公共静态IEnumerable搜索(字符串搜索路径、字符串搜索模式)
{
IEnumerable files=GetFileSystemEntries(searchPath、searchPattern);
foreach(文件中的字符串文件)
{
生成返回文件;
}
IEnumerable directories=GetDirectories(searchPath);
foreach(目录中的字符串目录)
{
文件=搜索(目录、搜索模式);
foreach(文件中的字符串文件)
{
生成返回文件;
}
}
}
私有静态IEnumerable GetDirectory(字符串目录)
{
IEnumerable子目录=null;
尝试
{
subDirectories=Directory.EnumerateDirectories(目录“***”,SearchOption.TopDirectoryOnly);
}
捕获(未经授权的访问例外)
{
}
if(子目录!=null)
{
foreach(子目录中的字符串子目录)
{
收益返回子目录;
}
}
}
私有静态IEnumerable GetFileSystemEntries(字符串目录、字符串搜索模式)
{
IEnumerable files=null;
尝试
{
files=Directory.EnumerateFileSystemEntries(目录、searchPattern、SearchOption.TopDirectoryOnly);
}
捕获(未经授权的访问例外)
{
}
如果(文件!=null)
{
foreach(文件中的字符串文件)
{
生成返回文件;
}
}
}
}
您可以这样使用它:

IEnumerable<string> filesOrDirectories = FileDirectorySearcher.Search(@"C:\", "*.txt");

foreach (string fileOrDirectory in filesOrDirectories)
{
   // Do something here.
}
IEnumerable filesOrDirectories=FileDirectorySearcher.Search(@“C:\”,“*.txt”);
foreach(fileordirectories中的字符串fileOrDirectory)
{
//在这里做点什么。
}

它是递归的,但是使用yield使它的内存占用率很低(在我的测试中低于10KB)。如果您只需要与模式匹配的文件,而不需要与目录匹配的文件,只需将
EnumerateFileSystemEntries
替换为
EnumerateFiles

就可以将其称为功能,而不是bug。任何一个正常的用户都不会容忍一个程序在枚举c:\驱动器上的每个文件时会僵死几分钟。TB是一个大数字。@Hans谁说当代码执行时应用程序正在运行UI?那代码有一个大错误。。。因为EnumerateDirectory将返回一个IEnumerable,然后当您迭代IEnumerable时,您将得到UnauthorizedAccessException。。我已经更新了上面的代码。嗨@BlakeNiemyjski,我一直在查看代码,但无法重现您所说的编辑地址的问题。你能告诉我复制它的具体步骤吗?你的代码正在收集系统文件夹,比如回收站。我会以管理员身份运行您的代码,并将其指向您的windowsdrive@BlakeNiemyjski我在Windows2008R2服务器上以管理员的身份试用了它,在XP工作站上以标准用户的身份试用了它,在XP工作站上以管理员的身份试用了
FileDirectorySearcher.Search(@“C:\”,“*”)。我仍然无法复制未经授权的UnauthorizedAccessException。作为一名管理员,它枚举了RECYCLER文件夹的内容,作为一名标准用户,它捕获了异常并继续运行。我在Windows7x64上看到了这个问题。我把它指向我的C盘和其他硬盘。尝试在资源管理器中启用“显示系统”和“隐藏文件夹”。。