如何从文件中提取未知数量的文本



这与我之前提出的一个问题有关,即使用正则表达式搜索包含特定字符串的方法,有人建议我使用名为Roslyn的MS工具,但自2012年问世以来,它不适用于VS2010。

因此,我正在编写这个小实用程序,以保留解决方案中包含特定方法声明的每个文件的列表(大约25k个文件中有3k个重载了该方法)。然后,我只想将该文件列表筛选为仅在方法体中包含+=的文件。

static void DirSearch(string dir)
{
    string[] files = Directory.GetFiles(dir, "*.*", SearchOption.AllDirectories);
    foreach (var file in files)
    {
        var contents = File.ReadAllText(file);
        if (contents.Contains("void DetachEvents()"))
        {
            //IF DetachEvents CONTAINS += THEN...
                WriteToFile(file);
        }                
     }
}

这个方法遍历所有文件夹,如果其中包含key方法,则将文件名写入文本文件,但我不知道如何提取方法体中的内容,因为它重载了该方法的所有3K实例。

最好的方法是获得方法名称的索引,然后是每个{}的索引,直到我遇到下一个访问器修饰符(表示我已经到达DetachEvents的末尾)吗?然后我可以在indexOfMethodindexOfEndMethod之间搜索+=

但这听起来真的很草率,我希望有人能有更好的主意?

你必须在代码中这样做吗?这是用于识别问题方法的一次性实用程序吗?为什么不使用类似Notepad++和它的Find in Files功能呢。你可以很容易地过滤你的发现,甚至应用正则表达式(我认为)。从那里,您可以复制包括文件名(即someclassfile.cs)的结果,并从中获得列表。

我写了这个非常草率的winform,它允许用户在文件夹中键入代码库、方法名和他们要查找的公然文本。然后,它在目录中的每个文件上循环,并在包含文件所有文本的字符串上调用此方法。如果存在用户输入的公然数据,它将返回true,然后调用它的方法将其上的文件添加到列表中。无论如何,这是主要代码:

    private bool ContainsFlag(string contents)
    {
        int indexOfMethodDec = contents.IndexOf(_method);
        int indexOfNextPublicMethod = contents.IndexOf("public", indexOfMethodDec);
        if (indexOfNextPublicMethod == -1)
            indexOfNextPublicMethod = int.MaxValue;
        int indexOfNextPrivateMethod = contents.IndexOf("private", indexOfMethodDec);
        if (indexOfNextPrivateMethod == -1)
            indexOfNextPrivateMethod = int.MaxValue;
        int indexOfNextProtectedMethod = contents.IndexOf("protected", indexOfMethodDec);
        if (indexOfNextProtectedMethod == -1)
            indexOfNextProtectedMethod = int.MaxValue;
        int[] indeces = new int[3]{indexOfNextPrivateMethod,
                                   indexOfNextProtectedMethod,
                                   indexOfNextPublicMethod};
        int closestToMethod = indeces.Min();
        if (closestToMethod.Equals(Int32.MaxValue))
            return false; //This should probably do something different.. This condition is true if the method you're reading is the last method in the class, basically
       if (closestToMethod - indexOfMethodDec < 0)
            return false;
        string methodBody = contents.Substring(indexOfMethodDec, closestToMethod - indexOfMethodDec);
        if (methodBody.Contains(_flag))
            return true;
        return false;
    }

有很大的改进空间,这主要只是一个概念验证,可能每年在内部使用两次。但出于我的目的,它起了作用。如果有人需要的话,这应该是一个更复杂的东西的好起点。

最新更新