2013-12-10 31 views
0

這種情況與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); 
     }     
    } 
} 

這種方法遍歷所有文件夾和寫入的文件名,如果它包含的主要手段的文本文件,但我不知道如何提取方法主體只是凡是,因爲它重載所有3K該方法的實例是不同的。

請問最好的辦法是獲得方法名的索引,那麼每個{}的指標,直到我遇到下一個訪問修飾符(表示我已經得到了的DetachEvents結束)?然後我可以在indexOfMethodindexOfEndMethod之間搜索+=

但它聽起來很sl,,我希望有人可能有更好的主意?

+0

@ P.Brian.Mackey我不確定你的意思。我不打算讓我的工具修改任何代碼,只是告訴我哪些代碼有錯誤。所以,它只是讀取它們的內容,並且如果文件名有明顯的數據,則將其寫入本地文件,以便我返回並手動更改。我不期望有驚人數量的錯誤數據,但我不想手動檢查3K文件;) – sab669

+0

您的代碼庫中是否真的有3,000種不同的重載方法? – acfrancis

+0

@acfrancis在沒有任何「過濾」的情況下,在我的文章中快速運行代碼會生成一個包含大約2.9k條目左右的文本文件。它們實際上並不是從一個公共接口重載一個方法,但它們只是在方法簽名('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問題)以及其他幾個人稱其很難創建一個可以找到問題的每個實例的正則表達式,因爲每種方法都會刪除不同數量的事件處理程序。 此外,我無法想象在N ++中打開28K文件來搜索。 – sab669

+0

評論長度限制!我願意接受任何解決方案,所以如果你知道一種方法,我可以用N ++的搜索功能輕鬆地解析這些不正確方法體的列表, – sab669

相關問題