那里不乏搜索字符串性能问题,但我仍然无法确定最佳方法是什么。
长话短说,我已经承诺从 4NT 转移到 PowerShell。在离开 4NT 时,我会想念它附带的名为 FFIND 的控制台超级快速字符串搜索实用程序。我决定使用我的基本 C# 编程技能来尝试创建我自己的实用程序,以便在 PowerShell 中使用,它同样快。
到目前为止,在跨越几个 1000 个文件的 100 个目录中进行字符串搜索的搜索结果,其中一些文件非常大,是 FFIND 2.4 秒和我的实用程序 4.4 秒.....在我至少运行了一次之后??? ?
我第一次运行它们 FFIND 几乎在同一时间运行,但我的运行时间超过一分钟?这是什么?加载库?文件索引?我在我的代码中做错了吗?我不介意再等一会儿,但差异非常大,如果有更好的语言或方法,我宁愿现在就开始走这条路,以免投入过多。
我是否需要选择另一种语言来编写快速点亮的字符串搜索
我需要使用此实用程序在 1000 个文件中搜索 Web 代码、C# 代码和另一种使用文本文件的支持语言中的字符串。我还需要能够使用此实用程序在非常大的日志文件(MB 大小)中查找字符串。
class Program
{
public static int linecounter;
public static int filecounter;
static void Main(string[] args)
{
//
//INIT
//
filecounter = 0;
linecounter = 0;
string word;
// Read properties from application settings.
string filelocation = Properties.Settings.Default.FavOne;
// Set Args from console.
word = args[0];
//
//Recursive search for sub folders and files
//
string startDIR;
string filename;
startDIR = Environment.CurrentDirectory;
//startDIR = "c:\\SearchStringTestDIR\\";
filename = args[1];
DirSearch(startDIR, word, filename);
Console.WriteLine(filecounter + " " + "Files found");
Console.WriteLine(linecounter + " " + "Lines found");
Console.ReadKey();
}
static void DirSearch(string dir, string word, string filename)
{
string fileline;
string ColorOne = Properties.Settings.Default.ColorOne;
string ColorTwo = Properties.Settings.Default.ColorTwo;
ConsoleColor valuecolorone = (ConsoleColor)Enum.Parse(typeof(ConsoleColor), ColorOne);
ConsoleColor valuecolortwo = (ConsoleColor)Enum.Parse(typeof(ConsoleColor), ColorTwo);
try
{
foreach (string f in Directory.GetFiles(dir, filename))
{
StreamReader file = new StreamReader(f);
bool t = true;
int counter = 1;
while ((fileline = file.ReadLine()) != null)
{
if (fileline.Contains(word))
{
if (t)
{
t = false;
filecounter++;
Console.ForegroundColor = valuecolorone;
Console.WriteLine(" ");
Console.WriteLine(f);
Console.ForegroundColor = valuecolortwo;
}
linecounter++;
Console.WriteLine(counter.ToString() + ". " + fileline);
}
counter++;
}
file.Close();
file = null;
}
foreach (string d in Directory.GetDirectories(dir))
{
//Console.WriteLine(d);
DirSearch(d,word,filename);
}
}
catch (System.Exception ex)
{
Console.WriteLine(ex.Message);
}
}
}
}