如何在项目文件夹中找到不再在项目中的.CS文件?

时间:2009-04-17 14:27:05

标签: c# .net visual-studio

由于我们的项目多年来不断发展,许多.cs文件已从项目中删除,重命名等,但仍保留在源代码管理中。因此,当您提取最新代码时,您将获得所有.csproj文件中不再引用的.cs文件。

任何人都知道一种简单,可靠的机制来检测这些文件并将其删除吗?

6 个答案:

答案 0 :(得分:5)

最好使用脚本语言完成此任务。我发现powershell非常适合这种情况。

第1步是找到csproj文件中包含的所有实际.cs文件。以下函数将在目录结构中搜索所有csproj文件,并返回这些文件中包含的.cs文件集

function Get-IncludedCsFiles() {
  param ( $rootPath = $(throw "Need a path") )
  $projFiles = gci -re -in *.csproj $rootPath
  foreach ( $file in $projFiles ) { 
    $dir = split-path $file.FullName
    foreach ( $line in (gc $file) ) { 
      if ( $line -match 'Compile\s+Include="([^"]+)"' ) {
        join-path $dir $matches[1]
      }
    }
  }
}

现在您需要做的就是将其包装到字典中,然后在目录结构中进行搜索

$map = @{}
$pathToSearch = "Path\To\Search"
Get-IncludedCsFiles $pathToSearch | 
%{
    if(!$map.Contains($_))
    {
      $map.Add($_, $true)
    } 
}
$notIncluded = gci -re -in *.cs $path | ?{ -not $map.Contains($_.FullName) }

答案 1 :(得分:4)

在VS解决方案资源管理器中尝试“显示所有文件”。

答案 2 :(得分:1)

目前我手头还没有VS,但是解决方案资源管理器中没有“在项目中显示文件”选项吗?

答案 3 :(得分:1)

前段时间我做了一个小项目。可用here

答案 4 :(得分:1)

感谢JaredPar的解决方案!因为这对我来说要容易得多:) 你提供的有点强大的版本。

function Get-IncludedCsFiles() 
{
  param ( $rootPath = $(throw "Need a path") )
  $projFiles = gci -re -in *.csproj $rootPath
  foreach ( $file in $projFiles ) 
  {
    $dir = split-path $file.FullName
    foreach ( $line in (gc $file) ) 
    { 
      $correctedLine = $line -replace '%28', '(' #some files have "(" in them, and csproj changes them for %28
      $correctedLine = $correctedLine -replace '%29', ')'

      if ($correctedLine -match 'Compile\s+Include="([^"]+)"') 
      {
        $filepath = join-path $dir $matches[1]
        [System.IO.Path]::GetFullPath($filePath)#this resolves path (removes \..\)
      }
    }
  }
}

$tempFilePattern = '*\obj\*'
$map = @{}
$pathToSearch = "Path to search"
$resultFilePath = [io.path]::combine($pathToSearch, 'notIncluded.txt')

Get-IncludedCsFiles $pathToSearch | 
%{
    if(!$map.Contains($_))
    {
      $map.Add($_, $true)
    }
}

echo "Map created"

$notIncluded = gci -re -in *.cs $path | ?{ (-not $map.Contains($_.FullName)) -and !($_ -like $tempFilePattern)} | %{$_.FullName}

$notIncluded | Out-File $resultFilePath

$notIncluded |
%{
    #tf delete $_ #Remove from TFS
}

它还考虑了名称中包含括号的文件,与csproj(或其下的子文件夹)不在同一文件夹中的文件。此外,它不包含使用编译(/ obj /文件夹)创建的临时生成的文件。 它列出了输出文件中的所有路径,您甚至可以从TFS中删除它们。

答案 5 :(得分:0)

可以避免此问题的一种方法是程序性的: (适用于除“网站”项目之外的任何项目,该项目没有项目文件):

不要从源代码控制工具中“获取最新”,而是始终在Visual Studio中执行“从源代码控制中打开”,并从解决方案资源管理器中获取最新信息。 VS只会提取属于项目的文件。

这不是一个完美的答案 - 当您执行合并时,您可能最终会删除分支中的每个文件,但它对我们来说非常有效。

(当然,这要求您使用提供VS集成的源代码控制工具 - 它还要求您将任何未编译但必需的文件(图标等)添加到项目中,否则它们不会被VS拉下来。