2014-04-08 49 views
1

我試圖搜索系統上所有捲上的特定文件名,系統卷信息或Windows目錄除外,併爲每個文件打印出每個完整路徑。搜索目錄中的特定文件名

我試着使用Directory.GetFiles,但它只能搜索器驅動器C內:\或驅動器d:\(取決於定,哪些驅動器)

我如何能實現我的目標是什麼?

例如我想運行的程序和搜索名爲「.DS_Store」文件(用於使用MAC,現在我的文件系統已滿這些文件的....)

我會很感激任何幫助。 謝謝您提前

UPD。方案應具有管理員權限執行工作

+2

你可以[獲取驅動器列表](http://msdn.microsoft.com/library/system.io.driveinfo.getdrives),但你真正的問題將是訪問權 – Sayse

+0

這就是爲什麼我說即時消息不會acc ess Windows或其他系統目錄(程序應該以管理員權限執行) –

回答

1

作爲cryptolocker分析的一部分,我寫的定位目標擴展的原型,在這裏是如何使用它

var cmd = new LocateTargetFilesCommand(); 
cmd.Execute() 

它會搜索h兩個擴展的所有驅動器:.xlsx.doc。最大的問題是處理權限問題。此外,子文件夾可能擁有更廣泛的權限,因此如果您無法訪問父文件夾,仍然可以訪問其根目錄。

最後,cmd.FoundTargets將包含找到的文件的絕對路徑與所需的擴展

public class LocateTargetFilesCommand 
{ 
    private string[] _targetExtensions = new[] 
     { 
      "xlsx", "doc" 
     }; 

    public LocateTargetFilesCommand() 
    { 
     FoundTargets = new ConcurrentQueue<string>(); 
     DirsToSearch = new List<string>(); 
    } 

    public ConcurrentQueue<string> FoundTargets { get; private set; } 
    public List<string> DirsToSearch { get; private set; } 

    public void Execute() 
    { 
     DriveInfo[] driveInfos = DriveInfo.GetDrives(); 

     Console.WriteLine("Start searching"); 
     foreach (var driveInfo in driveInfos) 
     { 

      if (!driveInfo.IsReady) 
       continue; 

      Console.WriteLine("Locating directories for drive: " + driveInfo.RootDirectory); 
      GetAllDirs(driveInfo.RootDirectory.ToString()); 
      Console.WriteLine("Found {0} folders", DirsToSearch.Count); 

      foreach (var ext in _targetExtensions) 
      { 
       Console.WriteLine("Searching for .*" + ext); 

       int currentNotificationProgress = 0; 
       for (int i = 0; i < DirsToSearch.Count; i++) 
       { 
        int progressPercentage = (i * 100)/DirsToSearch.Count; 
        if (progressPercentage != 0) 
        { 
         if (progressPercentage % 10 == 0 && currentNotificationProgress != progressPercentage) 
         { 
          Console.WriteLine("Completed {0}%", progressPercentage); 
          currentNotificationProgress = progressPercentage; 
         } 
        } 

        var dir = DirsToSearch[i]; 
        try 
        { 
         string[] files = Directory.GetFiles(dir, "*." + ext, SearchOption.TopDirectoryOnly); 
         foreach (var file in files) 
         { 
          FoundTargets.Enqueue(file); 
         } 
        } 
        catch (UnauthorizedAccessException ex) 
        { 
         Console.WriteLine("Skipping directory: {0}", dir); 
         DirsToSearch.Remove(dir); 
        } 
       } 

       Console.WriteLine("So far located {0} targets", FoundTargets.Count); 
      } 

      DirsToSearch.Clear(); 
     } 

     Console.WriteLine("Stop searching"); 
    } 

    public void GetAllDirs(string root) 
    { 
     try 
     { 
      string[] dirs = Directory.GetDirectories(root); 
      DirsToSearch.AddRange(dirs); 
      foreach (var dir in dirs) 
      { 
       GetAllDirs(dir); 
      } 
     } 
     catch (UnauthorizedAccessException) 
     { 
      //swallow 
     } 
    } 
} 
0

使用GetLogicalDrives

foreach (var d in Directory.GetLogicalDrives()) 
{   
    var files = Directory.GetFiles(d, file);   
} 
0

試試這個:

foreach (var drive in Directory.GetLogicalDrives()) 
{ 
    foreach (var fileInfo in from dir in Directory.GetDirectories(drive) from file in Directory.GetFiles(dir) select new FileInfo(file)) 
    { 
     // get all details in fileInfo 
    } 
} 
0

THX到奧萊克西,但這裏是我如何使用這個代碼排除所有系統目錄

public class LocateTargetFilesCommand 
     { 
      private string[] _targetExtensions = new[] 
     { 
      ".DS_Store" 
     }; 

     public LocateTargetFilesCommand() 
     { 
      FoundTargets = new ConcurrentQueue<string>(); 
      DirsToSearch = new List<string>(); 
     } 

     public ConcurrentQueue<string> FoundTargets { get; private set; } 
     public List<string> DirsToSearch { get; private set; } 

     public void Execute() 
     { 
      DriveInfo[] driveInfos = DriveInfo.GetDrives(); 

      Console.WriteLine("Start searching"); 
      foreach (var driveInfo in driveInfos) 
      { 

       if (!driveInfo.IsReady) 
        continue; 

       Console.WriteLine("Locating directories for drive: " + driveInfo.RootDirectory); 
       GetAllDirs(driveInfo.RootDirectory.ToString()); 
       Console.WriteLine("Found {0} folders", DirsToSearch.Count); 

       foreach (var ext in _targetExtensions) 
       { 
        Console.WriteLine("Searching for " + ext); 

        int currentNotificationProgress = 0; 
        for (int i = 0; i < DirsToSearch.Count; i++) 
        { 
         int progressPercentage = (i * 100)/DirsToSearch.Count; 
         if (progressPercentage != 0) 
         { 
          if (progressPercentage % 10 == 0 && currentNotificationProgress != progressPercentage) 
          { 
           Console.WriteLine("Completed {0}%", progressPercentage); 
           currentNotificationProgress = progressPercentage; 
          } 
         } 

         var dir = DirsToSearch[i]; 
         try 
         { 
          string[] files = Directory.GetFiles(dir, ext, SearchOption.TopDirectoryOnly); 
          foreach (var file in files) 
          { 
           FoundTargets.Enqueue(file); 
          } 
         } 
         catch (UnauthorizedAccessException ex) 
         { 
          Console.WriteLine("Skipping directory: {0}", dir); 
          DirsToSearch.Remove(dir); 
         } 
        } 

        Console.WriteLine("So far located {0} targets", FoundTargets.Count); 
       } 

       DirsToSearch.Clear(); 
      } 

      Console.WriteLine("Stop searching"); 
     } 

     public void GetAllDirs(string root) 
     { 
      try 
      { 
       string[] dirs = Directory.GetDirectories(root); 
       DirsToSearch.AddRange(dirs); 
       foreach (var dir in dirs) 
       { if(dir.Contains("Windows")) 
         Console.WriteLine("Skipped Windows Directory"); 
        else if (dir.Contains("Users")) 
         Console.WriteLine("Skipped Users Directory"); 
        else if (dir.Contains("MSOCache")) 
         Console.WriteLine("Skipped MSOCache Directory"); 
        else if (dir.Contains("SYSTEM.SAV")) 
         Console.WriteLine("Skipped SYSTEM.SAV Directory"); 
        else if (dir.Contains("ProgramData")) 
         Console.WriteLine("Skipped ProgramData Directory"); 
        else if (dir.Contains("System Volume Information")) 
         Console.WriteLine("Skipped System Volume Information Directory"); 
        else if (dir.Contains("$SysReset")) 
         Console.WriteLine("Skipped $SysReset Directory"); 
        else 
        GetAllDirs(dir); 
       } 
      } 
      catch (UnauthorizedAccessException) 
      { 

      } 
} 
相關問題