2009-04-17 125 views
4

随着我们的项目多年来不断演变,许多.cs文件已从项目中删除,重命名等,但仍保留在源代码管理中。因此,当您拉取最新的代码时,您将获得所有这些不再在任何.csproj文件中引用的.cs文件。如何在项目文件夹中找到不在项目中的.CS文件?

任何人都知道检测这些文件并消除它们的简单可靠的机制?

+0

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

+0

我认为,这些文件只存在于源代码管理中,并且有特殊标记。我想你会尝试直接从源代码控制中删除 – isxaker 2015-11-13 10:52:25

回答

5

对这项任务最好使用脚本语言。我发现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) } 
1

我目前没有VS,但在解决方案资源管理器中没有“Show Files Not in Project”选项?

+0

这是解决方案资源管理器工具栏上的“显示所有文件”。 – Richard 2009-04-17 15:09:13

4

尝试VS解决方案资源管理器中的“显示所有文件”。你能避免这个问题

0

一种方式是程序: (适用于除一个“网站”项目中的任何项目,没有项目文件):

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

这不是一个完美的答案 - 当你执行合并时,你最终可能会拖下你的分支中的每个文件,但它对我们来说工作得很好。 (当然,这需要你使用一个提供VS集成的源代码控制工具 - 它还要求你添加任何未编译但需要的文件(图标等)到你的项目中,否则他们会不会被VS拉下)。

1

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

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中删除它们。

相关问题