我正在尝试在属于某个目录的某些文件中搜索特定出现的字符串。(搜索也在子目录中进行。目前,我想出了一个类似这样的解决方案。
- 获取目录及其子目录中的所有文件名。
- 一个一个地打开文件。
- 搜索特定字符串
- 如果包含,则将文件名存储在数组中。
继续这个直到最后一个文件。
string[] fileNames = Directory.GetFiles(@"d:\test", "*.txt", SearchOption.AllDirectories); foreach (string sTem in fileNames) { foreach (string line in File.ReadAllLines(sTem)) { if (line.Contains(SearchString)) { MessageBox.Show("Found search string!"); break; } } }
我认为还有其他方法/方法比这更有效和更快吗?使用批处理文件?好的。另一种解决方案是使用 findstr (但是如何在没有批处理文件的情况下直接与 C# 程序一起使用它?什么是最有效的(或者比我做的更有效?)非常感谢代码示例!
找到了另一个解决方案。
Process myproc = new Process();
myproc.StartInfo.FileName = "findstr";
myproc.StartInfo.Arguments = "/m /s /d:\"c:\\REQs\" \"madhuresh\" *.req";
myproc.StartInfo.RedirectStandardOutput = true;
myproc.StartInfo.UseShellExecute = false;
myproc.Start();
string output = myproc.StandardOutput.ReadToEnd();
myproc.WaitForExit();
这种流程的执行好不好?也欢迎对此发表评论!
根据@AbitChev 的方法,圆滑的(不知道有没有效率!)。不管怎样,事情就这样继续下去。这个搜索所有目录以及子目录!
IEnumerable<string> s = from file in Directory.EnumerateFiles("c:\\directorypath", "*.req", SearchOption.AllDirectories)
from str in File.ReadLines(file)
//where str.Contains("Text@tosearched2")
where str.IndexOf(sSearchItem, StringComparison.OrdinalIgnoreCase) >= 0
select file;
foreach (string sa in s)
MessageBox.Show(sa);
(用于不区分大小写的搜索。也许这可以帮助某人。)请评论!谢谢。