ディレクトリに属するいくつかのファイルで特定の文字列を検索しようとしています。(検索はサブディレクトリでも実行されます。現在、私はこのような解決策を思いつきました。
- ディレクトリとそのサブディレクトリ内のすべてのファイル名を取得します。
- ファイルを 1 つずつ開きます。
- 特定の文字列を検索する
- 含まれている場合は、ファイル名を配列に格納します。
これを最後のファイルまで続けます。
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; } } }
これよりも効率的で高速な他の方法/アプローチがあると思いますか? バッチファイルを使用していますか? わかった。もう 1 つの解決策は、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);
(大文字と小文字を区別しない検索の場合。誰かを助けるかもしれません。)コメントしてください!ありがとう。