2009-04-17 127 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中刪除它們。

相關問題