如何在任何路径描述中找到文件?

How can I find a file within any description of path?

我需要在我的硬盘上找到特定的 file/folder。 例如我需要找到一个文件(do1.bat)然后存储文件的路径。但我不知道它可以存储在哪里,所以我必须扫描所有硬盘。 我如何为此使用 C#?

参考:https://msdn.microsoft.com/en-us/library/07wt70x2(v=vs.110).aspx

    List<string> lstfilepaths = new List<string>();
    public static void ProcessDirectory(string targetDirectory) 
    {
      // Process the list of files found in the directory.

       string [] fileEntries = Directory.GetFiles(targetDirectory);

       foreach(string fileName in fileEntries) // included as per your logic
       {
            if(fileName == "do1.bat")
              {
                 ProcessFile(fileName);
              }
       }

    // Recurse into subdirectories of this directory.
        string [] subdirectoryEntries = Directory.GetDirectories(targetDirectory);
        foreach(string subdirectory in subdirectoryEntries)
             ProcessDirectory(subdirectory);
     }

     public static void ProcessFile(string path) 
       {
        lstfilepaths.Add(path);    
       }

这应该会为您提供一个文件列表,与您的搜索模式相匹配

string[] Result = Directory.GetFiles(@"C:\", "do1.bat", SearchOption.AllDirectories);

一个简单的方法是

var results = Directory.GetFiles("c:\", "do1.bat", SearchOption.AllDirectories);

这将遍历所有目录并收集所有名为 do1.bat 的文件。不幸的是,这将 无法在完整的 c:\ 上工作,因为如果您无权访问目录,它会抛出 exceptions,这肯定会发生的。

所以这是一个递归版本:

private static void FindFile(DirectoryInfo currentDirectory, string pattern, List<FileInfo> results)
{
    try 
    {
        results.AddRange(currentDirectory.GetFiles(pattern, SearchOption.TopDirectoryOnly));
        foreach (DirectoryInfo dir in currentDirectory.GetDirectories("*", SearchOption.TopDirectoryOnly).Where(d => d.Name != "." && d.Name != ".."))
            FindFile(dir, pattern, results);
    }
    catch
    { 
        // probably no access to directory
    }
}

这遍历目录树并尝试获取目录中的文件,然后是所有子目录(...除外)。
您可以这样使用它:

DirectoryInfo d = new DirectoryInfo("c:\");
List<FileInfo> results = new List<FileInfo>();
FindFile(d, "do1.bat", results);

这将在 C:\ 的任何子目录中找到所有名为 do1.bat 的文件,并在 results 列表中登记 FileInfo

对于一个文件:

public string FindFileByName(string fileName, string searchPath)
{
    string resultPath = null;
    DirectoryInfo directoryInWhichToSearch = new DirectoryInfo(searchPath);

    FileInfo foundFile = directoryInWhichToSearch.GetFiles(fileName, SearchOption.AllDirectories)[0];

    resultPath = foundFile.FullName;

    return resultPath;
}

然后你可以像这样使用它:

string fileFullPath = FindFileByName("do1.bat", @"C:\");