2013-10-31 50 views
1

我想在我的文件枚举中过滤出路径C:\$Recycle.bin。我怎样才能做到这一点?SearchOption.AllDirectories过滤器

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

恐怕这可能是一个棘手的问题。我认为它是框架中的一个错误。 :( – Gabe

+0

你不能!唯一的选择是自己写一个递归函数 – Silvermind

+0

可能的重复[在搜索文件时访问被拒绝的错误](http://stackoverflow.com/questions/10458862/access-denied-error -in-while-searching-for-files) – Gabe

回答

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

运行良好,但我也想计算每个文件的md5。 – user2216791

+0

@ user2216791你可以在迭代每个文件的foreach时做到这一点''static void Main''方法的循环 – Silvermind

+0

我看到了,但我认为我正在计算md5的方式,它不喜欢这样一个事实,即我没有将它填满整个路径,而是我喂食它只是文件名。 (我认为) – user2216791