C# SearchOption.AllDirectory筛选器

C# SearchOption.AllDirectory筛选器,c#,filesystems,C#,Filesystems,我正在尝试筛选出文件枚举中的路径C:\$Recycle.bin。我该怎么做 var files = Directory.GetFiles(path, "*.*", SearchOption.AllDirectories).OrderBy(p => p).ToList(); 当我执行上述操作时,我得到下面的错误 其他信息:对路径“C:\$Recycle.Bin\S-1-5-21-1600837348-2291285090-976156579-500”的访问被拒绝 我还想计算每个文件的md5

我正在尝试筛选出文件枚举中的路径
C:\$Recycle.bin
。我该怎么做

var files = Directory.GetFiles(path, "*.*", SearchOption.AllDirectories).OrderBy(p => p).ToList();
当我执行上述操作时,我得到下面的错误

其他信息:对路径“C:\$Recycle.Bin\S-1-5-21-1600837348-2291285090-976156579-500”的访问被拒绝

我还想计算每个文件的md5。我有:

                    var mainDirectory = new DirectoryInfo("\\");

                    var files = GetDirectories(mainDirectory);
                    List<string> drives = new List<string>();

                    foreach (var file in files)
                    {
                        //Console.WriteLine(file.Name);
                        drives.Add(mainDirectory + file.Name);
                    }

                    MD5 md5 = MD5.Create();

                    foreach (string file in drives)
                    {
                        // hash path
                        string relativePath = file.Substring("\\".Length + 1);
                        byte[] pathBytes = Encoding.UTF8.GetBytes(relativePath.ToLower());
                        md5.TransformBlock(pathBytes, 0, pathBytes.Length, pathBytes, 0);

                        // hash contents
                        try
                        {
                            byte[] contentBytes = File.ReadAllBytes(file);

                            md5.TransformBlock(contentBytes, 0, contentBytes.Length, contentBytes, 0);
                            md5.TransformFinalBlock(contentBytes, 0, contentBytes.Length);
                        }
                        catch(UnauthorizedAccessException)
                        {
                            continue;
                        }
                        catch 
                        {
                            continue;
                        } 

                        Console.WriteLine(BitConverter.ToString(md5.Hash).Replace("-", "").ToLower());
                    }
                    Console.ReadKey();
var mainDirectory=newdirectoryinfo(“\\”);
var files=GetDirectories(mainDirectory);
列表驱动器=新列表();
foreach(文件中的var文件)
{
//Console.WriteLine(file.Name);
drives.Add(mainDirectory+file.Name);
}
MD5 MD5=MD5.Create();
foreach(驱动器中的字符串文件)
{
//散列路径
string relativePath=file.Substring(“\\”.Length+1);
byte[]pathBytes=Encoding.UTF8.GetBytes(relativePath.ToLower());
TransformBlock(pathBytes,0,pathBytes.Length,pathBytes,0);
//散列内容
尝试
{
byte[]contentBytes=File.ReadAllBytes(文件);
TransformBlock(contentBytes,0,contentBytes.Length,contentBytes,0);
md5.TransformFinalBlock(contentBytes,0,contentBytes.Length);
}
捕获(未经授权的访问例外)
{
继续;
}
抓住
{
继续;
} 
WriteLine(BitConverter.ToString(md5.Hash).Replace(“-”,”).ToLower());
}
Console.ReadKey();

下面的方法可以为您做到这一点,但这是一种快速而肮脏的方法,因为它不处理任何异常。我没有考虑任何可读性,也没有经过充分测试

    static void Main(string[] args)
    {
        var mainDirectory = new DirectoryInfo("C:\\");
        var files = GetFiles(mainDirectory, ".");
        foreach (var file in files)
        {
            Console.WriteLine(file.Name);
        }
        Console.ReadKey();
    }

    static IEnumerable<DirectoryInfo> GetDirectories(DirectoryInfo parentDirectory)
    {
        DirectoryInfo[] childDirectories = null;
        try
        {
            childDirectories = parentDirectory.GetDirectories();
        }
        catch (Exception)
        {

        }
        yield return parentDirectory;
        if (childDirectories != null)
        {
            foreach (var childDirectory in childDirectories)
            {
                var childDirectories2 = GetDirectories(childDirectory);
                foreach (var childDirectory2 in childDirectories2)
                {
                    yield return childDirectory2;
                }
            }
        }
    }

    static IEnumerable<FileInfo> GetFiles(DirectoryInfo parentDirectory, 
                                          string searchPattern)
    {
        var directories = GetDirectories(parentDirectory);
        foreach (var directory in directories)
        {
            FileInfo[] files = null;
            try
            {
                files = directory.GetFiles(searchPattern);
            }
            catch (Exception)
            {
            }
            if (files != null)
            {
                foreach (var file in files)
                {
                    yield return file;
                }
            }
        }
    }
static void Main(字符串[]args)
{
var mainDirectory=newdirectoryinfo(“C:\\”);
var files=GetFiles(mainDirectory,“.”);
foreach(文件中的var文件)
{
Console.WriteLine(file.Name);
}
Console.ReadKey();
}
静态IEnumerable GetDirectory(DirectoryInfo父目录)
{
DirectoryInfo[]childDirectories=null;
尝试
{
childDirectories=parentDirectory.GetDirectories();
}
捕获(例外)
{
}
返回父目录;
if(childDirectories!=null)
{
foreach(childDirectories中的var childDirectory)
{
var childDirectories2=GetDirectories(childDirectory);
foreach(childDirectories2中的变量childDirectory2)
{
收益-收益-子目录2;
}
}
}
}
静态IEnumerable GetFiles(DirectoryInfo父目录,
字符串搜索模式)
{
var directories=GetDirectories(parentDirectory);
foreach(目录中的var目录)
{
FileInfo[]files=null;
尝试
{
files=directory.GetFiles(searchPattern);
}
捕获(例外)
{
}
如果(文件!=null)
{
foreach(文件中的var文件)
{
生成返回文件;
}
}
}
}

下面的方法可以为您做到这一点,但这是一种快速而肮脏的方法,因为它不处理任何异常。我没有考虑任何可读性,也没有经过充分测试

    static void Main(string[] args)
    {
        var mainDirectory = new DirectoryInfo("C:\\");
        var files = GetFiles(mainDirectory, ".");
        foreach (var file in files)
        {
            Console.WriteLine(file.Name);
        }
        Console.ReadKey();
    }

    static IEnumerable<DirectoryInfo> GetDirectories(DirectoryInfo parentDirectory)
    {
        DirectoryInfo[] childDirectories = null;
        try
        {
            childDirectories = parentDirectory.GetDirectories();
        }
        catch (Exception)
        {

        }
        yield return parentDirectory;
        if (childDirectories != null)
        {
            foreach (var childDirectory in childDirectories)
            {
                var childDirectories2 = GetDirectories(childDirectory);
                foreach (var childDirectory2 in childDirectories2)
                {
                    yield return childDirectory2;
                }
            }
        }
    }

    static IEnumerable<FileInfo> GetFiles(DirectoryInfo parentDirectory, 
                                          string searchPattern)
    {
        var directories = GetDirectories(parentDirectory);
        foreach (var directory in directories)
        {
            FileInfo[] files = null;
            try
            {
                files = directory.GetFiles(searchPattern);
            }
            catch (Exception)
            {
            }
            if (files != null)
            {
                foreach (var file in files)
                {
                    yield return file;
                }
            }
        }
    }
static void Main(字符串[]args)
{
var mainDirectory=newdirectoryinfo(“C:\\”);
var files=GetFiles(mainDirectory,“.”);
foreach(文件中的var文件)
{
Console.WriteLine(file.Name);
}
Console.ReadKey();
}
静态IEnumerable GetDirectory(DirectoryInfo父目录)
{
DirectoryInfo[]childDirectories=null;
尝试
{
childDirectories=parentDirectory.GetDirectories();
}
捕获(例外)
{
}
返回父目录;
if(childDirectories!=null)
{
foreach(childDirectories中的var childDirectory)
{
var childDirectories2=GetDirectories(childDirectory);
foreach(childDirectories2中的变量childDirectory2)
{
收益-收益-子目录2;
}
}
}
}
静态IEnumerable GetFiles(DirectoryInfo父目录,
字符串搜索模式)
{
var directories=GetDirectories(parentDirectory);
foreach(目录中的var目录)
{
FileInfo[]files=null;
尝试
{
files=directory.GetFiles(searchPattern);
}
捕获(例外)
{
}
如果(文件!=null)
{
foreach(文件中的var文件)
{
生成返回文件;
}
}
}
}

恐怕这是一个棘手的问题。我认为它是框架中的一个错误。(你不能!唯一的选择是自己编写递归函数。可能的重复项就是不能使用驱动器根目录上的所有目录。回收站不是你作为管理员也无法访问的唯一目录。你需要跳过那些目录为I的目录。)