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

时间:2013-12-10 20:53:47

标签: c# winforms .net-3.5

这种联系回question I had earlier about a regex to search for a method containing a particular string,有人建议我使用这个名为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);
        }                
     }
}

此方法遍历所有文件夹并将文件名写入文本文件(如果它包含密钥方法),但我不知道如何在方法体中提取whatevers,因为它重载了方法的所有3K实例是不同的。

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

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

2 个答案:

答案 0 :(得分:0)

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

答案 1 :(得分:0)

我写了这个非常草率的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;
    }

充足的改进空间,这主要是一个概念验证的事情,每年内部可能会使用两次。但就我的目的而言,它有效。如果有人需要,应该是一个更复杂的起点的好起点。