2008-10-29 58 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文件中找到引用。

相关问题