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

本文关键字:文件夹 层次结构 文件 定义 系统 于定义 查找 | 更新日期: 2023-09-27 18:07:57

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

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

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

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

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

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

谢谢。

编辑:

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

使用复杂模式搜索目录中的文件。

我个人觉得很难避免递归。因为文件系统没有被索引。谷歌桌面或微软桌面搜索索引所有文件。在那里,如果你查询,你会很快得到答案。

我们的选择是。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代码

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);
 }

看一下目录。getfile方法。这应该是你想要的。

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

或者,您可以调用Directory。EnumeratFiles,它将为您执行递归。

你的选择#2可能是正确的。

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