2013-12-10 3 views
0

Этот вид связей возвращается к question I had earlier about a regex to search for a method containing a particular string, и кто-то предложил использовать этот MS-инструмент под названием Roslyn, но он не доступен для VS2010 с 2012 года.Как извлечь неизвестное количество текста из файла

Итак, я пишу эту небольшую утилиту, чтобы вести список каждого файла в моем решении, который содержит объявление определенного метода (что-то вроде 3k из 25k файлов перегружает этот метод). Затем я просто хочу отфильтровать этот список файлов только для тех, которые содержат += внутри тела метода.

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)? Тогда я мог бы просто искать между indexOfMethod и indexOfEndMethod за +=.

Но это звучит очень неряшливо, я надеялся, что у кого-то может быть лучшая идея?

+0

@ P.Brian.Mackey Я не уверен, что вы имеете в виду. Я не хочу, чтобы мой инструмент менял какой-либо код, просто скажите, какие из них имеют ошибку. Таким образом, это только чтение их содержимого и запись имени файла в локальный файл, если у них есть вопиющие данные, для меня вернуться и вручную изменить. Я не ожидаю тревожного количества неправильных данных, но я не хочу вручную проверять файлы 3K;) – sab669

+0

У вас действительно есть 3000 различных перегрузок одного и того же метода в вашей кодовой базе? – acfrancis

+0

@acfrancis Быстрое выполнение кода здесь, в моем сообщении без какой-либо «фильтрации», дает текстовый файл с примерно 2,9 тыс. Записей или около того. На самом деле они не перегружают метод из одного общего интерфейса, но они имеют только одну и ту же подпись метода ('private void DetachEvents()'), где она идет, и, как следует из названия, отделяет события от каждого элемента управления. Не совсем то же самое, что перегрузка, но достаточно близко, что я просто назвал это для простоты. – sab669

ответ

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; 
    } 

Много возможностей для улучшения, в основном это просто вещь проверки концепции, что привыкнут, может быть два раза в год внутри. Но для моих целей это сработало. Должно быть хорошей отправной точкой для чего-то более сложного, если кому-то это нужно.

0

Вам нужно сделать это в коде? Это одноразовая утилита для выявления проблемных методов? Почему бы не использовать что-то вроде Notepad++ и это Find in Files возможностей. Вы можете легко фильтровать свою находку и даже применять регулярное выражение (я думаю). Оттуда вы можете скопировать результаты, которые включают имя файла (то есть someclassfile.cs) и получить список оттуда.

+0

Вы правы в том, что это одноразовый инструмент. Ну, я полагаю, в будущем люди, вероятно, ошибочно назначат '+ =' вместо '- =', но что я могу сделать по этому поводу. Я попытался использовать поиск регулярных выражений, встроенный в Visual Studios, для поиска всего моего решения для нескольких разных вещей (см. Вопрос SO, который я связал в верхней части моего сообщения), и несколько других людей, взвесили, заявив, что было бы трудно создать Regex, который найдет каждый экземпляр проблемы, потому что каждый метод удаляет различное количество обработчиков событий. Кроме того, я не могу представить, как пытаться открыть 28K-файлы в N ++ для поиска. – sab669

+0

Ограничить длину комментария! Я открыт для любого решения, поэтому, если вы знаете, каким образом я мог бы легко разобрать список этих несобственных тел методов, используя поиск N ++, я все уши – sab669

Смежные вопросы