2008-10-29 82 views

回答

10

這是算法無法可靠計算的信息。被檢查的程序可以獲取所有資源的列表並且對它們做一些事情,比如讓用戶從多個圖標中選擇。

您最好的選擇可能是搜索到您選擇的資源訪問API的所有引用和手工檢查這些。使用grep/sed您可以通過處理使用簡單字符串的所有「簡單」工具手動減少需要手動檢查的網站。

1

我一直在考慮這個,我相信我有兩個選擇。這兩種方法都依賴於我使用輔助方法從資源文件中提取所需資源的事實。

  1. 記錄
    添加一些代碼來了「的getResource」一種或多種方法使每一個資源被訪問時,資源鍵被寫入日誌。然後嘗試訪問網站的每個部分(測試腳本在這裏可能會有所幫助)。生成的日誌條目應該提供所有活動資源鍵的列表,其餘可以被廢棄。

  2. 代碼分析
    我在看T4是否能夠通過解決工作和創造的所有引用的列表中「的getResource」輔助方法。結果鍵的列表將被激活,其餘的可以被刪除。

這兩種方法都有侷限性。日誌記錄方法只與測試覆蓋的代碼一樣好,代碼分析可能並不總是找到鍵而不是包含鍵的字符串,因此在那裏需要一些額外的手動工作。

我想我會嘗試兩個。我會讓你知道它是怎麼回事。

1

重命名您當前的圖片目錄,然後創建一個新的圖片,在VS中爲您的圖片路徑(例如'/ content/images')做一個find-in-files搜索,多選所有使用過的圖片並拖入新圖片圖像文件夾。 然後,您可以從項目中排除舊的目錄,或者將其刪除。

+0

問題不在於目錄中的物理圖像,而在於resx文件中的資源。 – 2012-02-20 14:15:05

10

我創建了一個免費的開源VS擴展,它會在一個項目中未使用的圖像,剛發佈的第一個版本:https://github.com/jitbit/vs-unused-image-finder

+0

這不符合我的預期。它刪除了使用過的圖像 – Jack 2016-03-13 17:00:10

+0

@Jack請在Github頁面上報告問題,說明圖像是如何「使用」的,所以我們可以修復它 – Alex 2016-03-14 18:01:12

6

因爲我無法找到一個簡單快速的解決方案還沒有,我發現至少有一個解決方案可以讓我得到我期待的結果,即使需要一些時間(對於懶惰的週日下午來說也是理想的)。

的解決方案涉及的Visual Studio .NET 2010和ReSharper的(我使用的是7.1版),並進入類似下面。

步驟一步的解決方案

1)在VS.右鍵單擊主RESX文件NET,然後從上下文菜單中選擇「查找用法」:

enter image description here

這將帶來ReSharper的「查找結果」窗口。

2)雙擊解窗口每次出現:

enter image description here

這將打開源代碼窗口與資源。

3)從源代碼窗口中重命名此資源:

enter image description here

它會彈出ReSharper的 「重命名資源」 對話框。

4.)給該資源一個新名稱,其中包含唯一前綴。在我的例子,這是「TaskDialog_」:

enter image description here

將重命名這兩個資源,並自動生成的C#包裝/門禁類。

5.)對「使用情況」窗口中的所有資源重複上述步驟2,3和4。

6)打開在Visual Studio的資源編輯器的RESX文件,然後選擇所有文件,而沒有前綴:

enter image description here

7)現在點擊「刪除資源」按鈕窗口的頂部或直接按德爾鍵:

enter image description here

你終於有一個RESX文件,只有在你的文件中使用過的資源。

8.)(可選)如果您有多種語言的資源(例如德語爲「Resources.de.resx」),請對這些RESX文件重複步驟7和8。

警告

請注意,如果您訪問比通過強類型,自動生成C#類Resources等你的字符串這是不行的。

3

我有一個類似的問題。我爲轉換表創建了幾千個資源字符串,其中很多資源字符串已不再需要或由代碼引用。大約有180個依賴代碼文件,我不會手動通過每個資源字符串。

以下代碼(在vb。淨額)將通過你的項目找到孤兒資源(在項目資源,而不是任何個人表格的資源)。我的項目花了大約1分鐘。可以修改它以查找字符串,圖像或任何其他資源類型。

綜上所述,

  • 1)使用解決方案項目文件收集所有包含的代碼 模塊並將它們附加到單個字符串變量;
  • 2)遍歷所有的項目資源對象,並創建一個列表(在我的情況下)的那些是字符串;
  • 3)字符串搜索查找組合項目文本變量中的資源字符串代碼;
  • 4)報告未被引用的資源對象。

該函數返回windows剪貼板上的對象名稱,用於粘貼電子表格或作爲資源名稱的列表數組。

編輯:在模塊例如呼叫:modTest
? modTest.GetUnusedResources("C:\Documents and Settings\me\My Documents\Visual Studio 2010\Projects\myProj\myProj.vbproj", True, true)

'project file is the vbproj file for my solution 
Public Function GetUnusedResources(projectFile As String, useClipboard As Boolean, strict As Boolean) As List(Of String) 


    Dim myProjectFiles As New List(Of String) 
    Dim baseFolder = System.IO.Path.GetDirectoryName(projectFile) + "\" 

    'get list of project files 
    Dim reader As Xml.XmlTextReader = New Xml.XmlTextReader(projectFile) 
    Do While (reader.Read()) 
     Select Case reader.NodeType 
      Case Xml.XmlNodeType.Element 'Display beginning of element. 
       If reader.Name.ToLowerInvariant() = "compile" Then ' only get compile included files 
        If reader.HasAttributes Then 'If attributes exist 
         While reader.MoveToNextAttribute() 
          If reader.Name.ToLowerInvariant() = "include" Then myProjectFiles.Add((reader.Value)) 
         End While 
        End If 
       End If 
     End Select 
    Loop 

    'now collect files into a single string 
    Dim fileText As New System.Text.StringBuilder 
    For Each fileItem As String In myProjectFiles 
     Dim textFileStream As System.IO.TextReader 
     textFileStream = System.IO.File.OpenText(baseFolder + fileItem) 
     fileText.Append(textFileStream.ReadToEnd) 
     textFileStream.Close() 
    Next 
    ' Debug.WriteLine(fileText) 

    ' Create a ResXResourceReader for the file items.resx. 
    Dim rsxr As New System.Resources.ResXResourceReader(baseFolder + "My Project\Resources.resx") 
    rsxr.BasePath = baseFolder + "Resources" 
    Dim resourceList As New List(Of String) 
    ' Iterate through the resources and display the contents to the console. 
    For Each resourceValue As DictionaryEntry In rsxr 
     ' Debug.WriteLine(resourceValue.Key.ToString()) 
     If TypeOf resourceValue.Value Is String Then ' or bitmap or other type if required 
      resourceList.Add(resourceValue.Key.ToString()) 
     End If 
    Next 
    rsxr.Close() 'Close the reader. 

    'finally search file string for occurances of each resource string 
    Dim unusedResources As New List(Of String) 
    Dim clipBoardText As New System.Text.StringBuilder 
    Dim searchText = fileText.ToString() 
    For Each resourceString As String In resourceList 
     Dim resourceCall = "My.Resources." + resourceString ' find code reference to the resource name 
     Dim resourceAttribute = "(""" + resourceString + """)" ' find attribute reference to the resource name 
     Dim searchResult As Boolean = False 
     searchResult = searchResult Or searchText.Contains(resourceCall) 
     searchResult = searchResult Or searchText.Contains(resourceAttribute) 
     If Not strict Then searchResult = searchResult Or searchText.Contains(resourceString) 
     If Not searchResult Then ' resource name no found so add to list 
      unusedResources.Add(resourceString) 
      clipBoardText.Append(resourceString + vbCrLf) 
     End If 
    Next 

    'make clipboard object 
    If useClipboard Then 
     Dim dataObject As New DataObject ' Make a DataObject clipboard 
     dataObject.SetData(DataFormats.Text, clipBoardText.ToString())  ' Add the data in string format. 
     Clipboard.SetDataObject(dataObject) ' Copy data to the clipboard. 
    End If 

    Return unusedResources 

End Function 
+0

謝謝,希望您不介意我添加一兩個額外的音符。我們有一個需要調查的幾千個資源字符串的表單,所以這個過程非常有用。原來,表單的Localizable屬性爲True,因此所有控件都將設置存儲在表單的resx中。設置爲false將事情切換回正常,並將resz的大小從600 + k縮小到35k! – 2015-07-02 15:18:36

5

我最近建立了一個工具,可以檢測和刪除未使用的字符串資源。我用這篇文章中的信息作爲參考。這個工具可能並不完美,但它可以完成繁重的工作,如果您有一個歷史悠久的大項目,它將非常有用。我們內部使用這個工具來整合資源文件,並刪除未使用的資源(我們擺脫了10000個以上的4000多個資源)。

你可以看一下源代碼,或者從這裏安裝的ClickOnce:https://resxutils.codeplex.com/

+2

這看起來很有希望(一旦我發現你必須刪除Resources.Designer.cs才能顯示任何結果)。但是它無法在XAML文件中找到引用,這是一個不容忽視的問題。 – RandomEngy 2014-09-06 16:13:53

2

我用ReSharper的查找未使用的資源字段,然後手動刪除他們,如果項目包含資源的量小。如果我們已經有未使用的項目列表,可以使用一些簡短的腳本。

的解決方案是下一個:

您將擁有所有未使用資源的列表,將其從resx中刪除。

14

我找不到任何現有的解決方案,將搜索在XAML文件和字符串資源引用批量刪除未使用的。

所以我寫了這一點:​​

RESX Unused Finder screenshot

它搜索到的字符串資源的引用項目目錄,然後顯示那些它不能找到一個匹配的列表。您可以指定一個模板進行搜索,以便它可以在XAML文件中找到引用。

相關問題