如何在项目文件夹中找到不在项目中的.CS文件?
随着我们的项目多年来不断演变,许多.cs文件已从项目中删除,重命名等,但仍保留在源代码管理中。因此,当您拉取最新的代码时,您将获得所有这些不再在任何.csproj文件中引用的.cs文件。如何在项目文件夹中找到不在项目中的.CS文件?
任何人都知道检测这些文件并消除它们的简单可靠的机制?
对这项任务最好使用脚本语言。我发现PowerShell非常适合这种情况。
第1步是查找所有包含在csproj文件中的.cs文件。下面的函数将搜索的目录结构为所有的csproj文件,并返回一组包含在这些文件
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]
}
}
}
}
现在,所有你需要做的是换行到一个字典,然后做一个搜索的.cs文件在目录结构中
$map = @{}
$pathToSearch = "Path\To\Search"
Get-IncludedCsFiles $pathToSearch |
%{
if(!$map.Contains($_))
{
$map.Add($_, $true)
}
}
$notIncluded = gci -re -in *.cs $path | ?{ -not $map.Contains($_.FullName) }
我目前没有VS,但在解决方案资源管理器中没有“Show Files Not in Project”选项?
这是解决方案资源管理器工具栏上的“显示所有文件”。 – Richard 2009-04-17 15:09:13
尝试VS解决方案资源管理器中的“显示所有文件”。你能避免这个问题
一种方式是程序: (适用于除一个“网站”项目中的任何项目,没有项目文件):
而不是做从“获取最新”的您的源代码管理工具始终在Visual Studio中执行“从源代码管理打开”,并从解决方案资源管理器获取最新信息。 VS只会提取属于该项目的文件。
这不是一个完美的答案 - 当你执行合并时,你最终可能会拖下你的分支中的每个文件,但它对我们来说工作得很好。 (当然,这需要你使用一个提供VS集成的源代码控制工具 - 它还要求你添加任何未编译但需要的文件(图标等)到你的项目中,否则他们会不会被VS拉下)。
感谢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中删除它们。
Effectively a dup of http://stackoverflow.com/questions/707113/in-visual-studio-whats-a-quick-way-to-delete-all-the-exclude-files-from-a-proje – 2009-04-17 14:37:06
我认为,这些文件只存在于源代码管理中,并且有特殊标记。我想你会尝试直接从源代码控制中删除 – isxaker 2015-11-13 10:52:25