■■■

2016年4月2日土曜日

Grep検索でファイル検索を行う方法

Grep検索でファイル検索を行う方法
VB.NET
Private Sub btn1_Click(ByVal sender As Object, _
ByVal e As EventArgs) Handles btn1.Click
Dim files As String() = _
Grep("C:\grep1", "検索したい文字列", "*.txt", False)
Dim f As String
For Each
f In files
Console.WriteLine(f)
Next f
End Sub

Public Shared Function Grep(ByVal dirPath As String, _
ByVal pattern As String, ByVal fileWildcards As String, _
ByVal ignoreCase As Boolean) As String()
Dim fileCol As New System.Collections.ArrayList()

Dim opts As System.Text.RegularExpressions.RegexOptions = _
System.Text.RegularExpressions.RegexOptions.None
If ignoreCase Then
opts = opts Or System.Text.RegularExpressions.RegexOptions.IgnoreCase
End If
Dim
reg As New System.Text.RegularExpressions.Regex(pattern, opts)

Dim dir As New System.IO.DirectoryInfo(dirPath)
Dim files As System.IO.FileInfo() = dir.GetFiles(fileWildcards)
Dim f As System.IO.FileInfo
For Each f In files
If ContainTextInFile(f.FullName, reg) Then
fileCol.Add(f.FullName)
End If
Next
f

Return CType(fileCol.ToArray(GetType(String)), String())
End Function

Private Shared Function ContainTextInFile(ByVal filePath As String, _
ByVal reg As System.Text.RegularExpressions.Regex) As Boolean
Dim strm As System.IO.StreamReader = Nothing
Dim
txt As String = ""
Try
strm = New System.IO.StreamReader( _
filePath, System.Text.Encoding.Default, True)
txt = strm.ReadToEnd()
Finally
strm.Close()
End Try

Return
reg.IsMatch(txt)
End Function
C#
private void btn1_Click(object sender, EventArgs e)
{
string[] files = Grep("C:\\docs1", "検索したい文字列", "*.txt", false);
foreach (string f in files)
{
Console.WriteLine(f);
}
}

public static string[] Grep(
string dirPath, string pattern, string fileWildcards, bool ignoreCase)
{
System.Collections.ArrayList fileCol =
new System.Collections.ArrayList();

System.Text.RegularExpressions.RegexOptions opts =
System.Text.RegularExpressions.RegexOptions.None;
if (ignoreCase)
opts |= System.Text.RegularExpressions.RegexOptions.IgnoreCase;
System.Text.RegularExpressions.Regex reg =
new System.Text.RegularExpressions.Regex(pattern, opts);

System.IO.DirectoryInfo dir = new System.IO.DirectoryInfo(dirPath);
System.IO.FileInfo[] files = dir.GetFiles(fileWildcards);
foreach (System.IO.FileInfo f in files)
{
if (ContainTextInFile(f.FullName, reg))
fileCol.Add(f.FullName);
}

return (string[])fileCol.ToArray(typeof(string));
}

private static bool ContainTextInFile(
string filePath, System.Text.RegularExpressions.Regex reg)
{
System.IO.StreamReader strm = null;
string txt = "";
try
{
strm = new System.IO.StreamReader(
filePath, System.Text.Encoding.Default, true);
txt = strm.ReadToEnd();
}
finally
{
strm.Close();
}

return reg.IsMatch(txt);
}

■■■