SearchOption.AllDirectories过滤器

时间:2013-10-31 19:32:09

标签: 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。我有:

                    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();

1 个答案:

答案 0 :(得分:0)

以下内容可以为您完成,但它是一种快速而肮脏的方式,因为它不处理任何异常。我没有考虑任何可读性,也没有经过全面测试。

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