查找系统中定义的文件夹层次结构中的所有文件

时间:2013-04-08 12:58:49

标签: c# .net directory

我想查找位于TestName.lol内的名称为TestRoot\TestSubFoler\Test\的系统中的所有文件。

即。如果磁盘 C D 都有TestRoot\TestSubFoler\Test\TestName.lol,那么我想获得2个文件。

我考虑过不同的方法:

  1. C:\D:\开始,然后递归搜索TestRoot。然后对所有发现的事件执行相同的操作,而不是C:\D:\。等等。

  2. 递归搜索TestName.lol的所有文件夹。然后过滤掉位于“错误”文件夹中的文件。 (我相信在我的情况下,这会更快,因为这些文件的估计数量不大:1-10)

  3. ???我相信可以有更好的方法(更优雅或更好的性能)。无论如何,如果您认为我的解决方案没问题,请确认一下。

  4. 感谢。

    编辑: Search file in directory using complex pattern一个类似的问题。

2 个答案:

答案 0 :(得分:1)

查看Directory.GetFiles方法。那应该做你想要的。

实际上,this overload可能就是你需要的那个。

或者,你可以打电话给Directory.EnumeratFiles,它会为你做递归。

您的选择#2可能是要走的路。

确实没有一种特别有效的方法可以做到这一点。你可以通过直接调用Windows FindFirstFindNext API函数来加快速度,但除非你这么做,否则它真的不值得。

答案 1 :(得分:1)

我个人觉得很难避免递归。因为文件系统没有索引。 Google桌面或Microsoft桌面搜索索引所有文件。如果你查询,你会很快得到答案。

我们的选择是.net框架为你做递归或你自己做。

其他选项是Linq - 我猜.net框架将执行递归。但它会更清洁

<强> LINQ的

http://msdn.microsoft.com/en-us/library/bb882649.aspx

// Take a snapshot of the file system.
        System.IO.DirectoryInfo dir = new System.IO.DirectoryInfo(startFolder);

        // This method assumes that the application has discovery permissions 
        // for all folders under the specified path.
        IEnumerable<System.IO.FileInfo> fileList = dir.GetFiles("*.*", System.IO.SearchOption.AllDirectories);

        string searchTerm = @"Visual Studio";

        // Search the contents of each file. 
        // A regular expression created with the RegEx class 
        // could be used instead of the Contains method. 
        // queryMatchingFiles is an IEnumerable<string>. 
        var queryMatchingFiles =
            from file in fileList
            where file.Extension == ".htm" 
            let fileText = GetFileText(file.FullName)
            where fileText.Contains(searchTerm)
            select file.FullName;

        // Execute the query.
        Console.WriteLine("The term \"{0}\" was found in:", searchTerm);
        foreach (string filename in queryMatchingFiles)
        {
            Console.WriteLine(filename);
        }

.net code

foreach (FileInfo fi in directory.GetFiles())
{
  // Console.WriteLine(@"Found file: [{0}] in directory: [{1}]", fi.Name, directory.FullName);

}
 foreach (DirectoryInfo diSourceSubDir in directory.GetDirectories())
 {
    // Console.WriteLine(@"Sub Folder {0} found.", diSourceSubDir.FullName);
 }