使用C#在目录层次结构中搜索文件以查找目标字符串

例程以递归方式搜索目录层次结构中的文件以查找目标字符串。它可以搜索几乎任何类型的文件,即使它不包含 Windows 理解的文本。例如,它可以搜索 DLL 和可执行文件以查看它们是否恰好包含字符串。

下面的代码中显示的ListFiles 方法完成了大部分工作。

cs 复制代码
// Add the files in this directory's subtree 
// that match the pattern to the ListBox.
private void ListFiles(ListBox lst, string pattern,
    DirectoryInfo dir_info, string target)
{
    // Get the files in this directory.
    FileInfo[] fs_infos = dir_info.GetFiles(pattern);
    foreach (FileInfo fs_info in fs_infos)
    {
        if (target.Length == 0)
        {
            lstResults.Items.Add(fs_info.FullName);
        } 
        else
        {
            string txt = File.ReadAllText(fs_info.FullName);
            if (txt.IndexOf(target, StringComparison.OrdinalIgnoreCase) >= 0)
            {
                lstResults.Items.Add(fs_info.FullName);
            }
        }
    }

    // Search subdirectories.
    DirectoryInfo[] subdirs = dir_info.GetDirectories();
    foreach (DirectoryInfo subdir in subdirs)
    {
        ListFiles(lst, pattern, subdir, target);
    }
}

ListFiles将DirectoryInfo作为参数,表示搜索应从哪里开始。它使用该对象的GetFiles方法获取与文件模式匹配的文件列表。如果没有要查找的目标字符串,程序只会将文件添加到结果列表中。

如果有目标字符串,程序将使用File.ReadAllText将文件的内容读入字符串。如果目标在字符串中,程序将文件添加到列表中。程序使用IndexOf方法而不是Contains,因此它可以使用OrdinalIgnoreCase参数在查找匹配项时忽略大小写。

搜索完此目录中的文件后,程序使用DirectoryInfo对象的GetDirectories方法获取其子目录的列表。程序递归调用ListFiles来搜索每个子目录。

这就是搜索代码的全部内容,但程序还做了一件更有趣的事情。启动时,它使用以下代码来确定是否从"发送到"菜单执行。

cs 复制代码
// If we launched from the Send To menu,
// use the argument as our directory.
private void Form1_Load(object sender, EventArgs e)
{
    if (System.Environment.GetCommandLineArgs().Length > 1)
    {
        txtDirectory.Text = System.Environment.GetCommandLineArgs()[1];
        txtTarget.Focus();
    }
}

此代码检查程序的命令行参数。第一个参数始终是执行程序的名称。如果有第二个参数,则它应该是拖到可执行文件上或通过"发送到"菜单发送到程序的目录的名称。如果有第二个参数,程序会将其放在"目录"文本框中。

为了方便使用此程序,我将其添加到"发送到"菜单中。然后我可以右键单击目录,打开"发送到"菜单(在 Windows 11 中更难),然后选择此程序以使其搜索目录。有关向"发送到"菜单添加项目的更多信息,请参阅向"发送到"菜单添加项目

结果并不像文件资源管理器的搜索那样花哨。您无法按文件日期、大小、作者、评级或任何其他您永远不想在搜索中使用的内容进行搜索。如果您愿意,您可以添加这些功能。

但是,这个程序可以搜索任何类型的文件。它甚至比 Windows 搜索还要快得多。

查看结果:

相关推荐
Aliano217几秒前
TestNGException ClassCastException SAXParserFactoryImpl是Java自带的Xerces解析器——解决办法
java·开发语言·python
漫谈网络4 分钟前
回调函数应用示例
开发语言·python·回调函数
亚林瓜子19 分钟前
pyenv简单的Python版本管理器(macOS版)
开发语言·python·macos·pyenv
夜松云20 分钟前
Qt信号槽机制与UI设计完全指南:从基础原理到实战应用
开发语言·qt·ui·qt designer·布局管理·参数传递·qt信号槽
珂朵莉MM30 分钟前
2024 睿抗机器人开发者大赛CAIP-编程技能赛-专科组(国赛)解题报告 | 珂学家
开发语言·人工智能·算法·leetcode·职场和发展·深度优先·图论
菥菥爱嘻嘻35 分钟前
JS手写代码篇---手写 new 操作符
开发语言·javascript·原型模式
qq_297908011 小时前
c#车检车构客户管理系统软件车辆年审短信提醒软件
sqlserver·c#·开源软件
_龙小鱼_1 小时前
Kotlin变量与数据类型详解
开发语言·微信·kotlin
保利九里1 小时前
java中的包机制
java·开发语言
SRC_BLUE_171 小时前
VulnHub | Breach - 1
开发语言·php·dreamweaver