【问题标题】:What is the best way to mimic the findstr functionality in c#?在 c# 中模仿 findstr 功能的最佳方法是什么?
【发布时间】:2009-07-07 22:03:49
【问题描述】:

我正在一个包含数千个文件的大型目录树中搜索数千个字符串。每个字符串可以出现在许多不同的文件中。在 c# 中执行此搜索的最高效方式是什么?我尝试从 findstr 开始 proccessinfo (但它非常慢,因为它会打开每个文件数千次)。有什么建议吗?

【问题讨论】:

  • 哪个操作系统?也许使用索引服务或 Windows 搜索?
  • 文件如何存储在树中?它们是实际的 File 对象还是以纯文本形式存储? (...或秘密选项编号 3?):-)
  • 我正在一个非常大的代码库中搜索资源键。因此文件类型各不相同,但可以使用 StreamReader 读取。现在我正在使用 Directory.GetFiles 来收集文件。现在我使用正则表达式库将密钥与包含每个文件内容的字符串匹配。我在 Window Server 2008 上运行。
  • 您是否有理由必须使用 C# 执行此操作?为什么不直接使用 findstr?毕竟,您可以告诉它针对整个目录树执行。
  • 我使用的是 findstr。但是因为我对每个字符串的出现位置感兴趣,所以我必须对每个文件执行数千次 find str ,每个字符串大约需要 30 秒(这很快就会加起来)。我想通过只打开每个文件一次来减少执行时间。现在每个文件大约需要 1 秒。

标签: c# search find


【解决方案1】:

我建议使用 Lucene.NET 创建一个索引文件树的小部件。一旦文档被编入索引,您就可以使用 Lucene 的所有功能以非常强大的方式搜索内容……而无需打开每个文件 1000 次! :P

不确定程序的生命周期...对于一次性使用场景而言,这可能不是一个好主意。对于多用途场景,您需要确保您有一个 Windows 服务,该服务会随着文件随时间的变化而更新您的索引(如果这很重要的话)。

一旦创建索引,这将非常高效!

【讨论】:

    【解决方案2】:

    您需要执行一次性搜索还是持续按需搜索?我建议要么绑定索引服务,要么实现你自己的 Lucene 索引。 Lucene 索引有很多开源实现,基本上你扫描文件一次并建立内容的综合索引,然后根据预制索引进行未来搜索。索引生成需要一段时间,但搜索速度非常快。这适用于“网络”类型的内容以及简单的短语和单词。

    如果您尝试查找非单词/任意随机字符串,那么您将面临不同的任务。

    -杰夫

    【讨论】:

      猜你喜欢
      • 2013-12-22
      • 2010-11-20
      • 2012-01-08
      • 2018-04-07
      • 1970-01-01
      • 2011-09-10
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多