0

我想在系统中找到名称TestName.lol位于TestRoot\TestSubFoler\Test\.

即,如果 aTestRoot\TestSubFoler\Test\TestName.lol在磁盘CD上都有,那么我想获得 2 个文件。

我考虑了不同的方法来做到这一点:

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

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

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

谢谢。

编辑: 使用复杂模式搜索目录中的文件类似的问题。

4

2 回答 2

1

看一下Directory.GetFiles方法。那应该做你想做的事。

实际上,这个重载可能是您需要的。

或者,您可以调用Directory.EnumratFiles,它会为您执行递归。

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

确实没有一种特别有效的方法可以做到这一点。FindFirst您可以通过直接调用 Windows和API 函数来加快速度FindNext,但除非您经常这样做,否则不值得付出努力。

于 2013-04-08T13:00:47.527 回答
1

我个人觉得很难避免递归。因为文件系统没有被索引。Google 桌面或 Microsoft 桌面搜索为所有文件编制了索引。如果您在那里查询,您将很快得到答案。

我们的选择是 .net 框架为您执行递归,或者您自己执行。

其他选项是 Linq - 我猜 .net 框架会进行递归。但它会更干净

林克

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 代码

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);
 }
于 2013-04-08T13:25:08.863 回答