57

マージなどの問題により、フォルダー内にすべてのソース コード ファイルが含まれていないプロジェクト ファイルが多数あります。

すべてのファイルがプロジェクト ファイルに含まれていることを確認する小さなツールを作成する前に、*.cs他の誰もそれを行っていないことを確認したいと思います。

(100 近くのプロジェクト ファイルと数千の C# ファイルがあります)

-------------------

プロジェクト内の特定のディレクトリからすべての「*.cs」ファイルを含めるために、ワイルドカードを使用するための Visual Studio のサポートが、この問題に対する最善の解決策であることは明らかです。そのため、「.cs」ファイルが追加され、名前が ete. ただし、これが UI から使用できるようになるのは VS2017 だけです。

4

12 に答える 12

66

その数のファイルとプロジェクトがあるので、もっと自動化されたものが必要なようです。ただし、手動によるアプローチがあります(すでに認識しているかどうかはわかりません)。

  1. ソリューションエクスプローラーペインでプロジェクトを選択します
  2. プロジェクトメニュー->すべてのファイルを表示
  3. プロジェクトの下では、プロジェクトの一部ではないファイルは「ゴースト」アイコンとして表示されます
  4. 必要なファイルを選択し、コンテキストメニューから[プロジェクトに含める]を選択します
于 2011-09-01T16:42:55.243 に答える
29

「 VS 2019 の不足しているファイルを表示する」Visual Studio 拡張機能を見つけました。ビルド後の「エラー リスト」ウィンドウに、プロジェクト ファイルから欠落しているリストと参照されていないリストの両方が表示されます。

古い Visual Studio の場合は、" Show missing files for VS 2013-2017 " 拡張子を使用します。

于 2016-10-06T04:10:25.523 に答える
7

これに対する解決策を探しているときに、このVS 拡張機能に遭遇しましたが、 VS 2012でしか機能しません。Githubにもあります。

VS 2013+ では、このブログ投稿にある Powershell スクリプトを使用します。これは C# プロジェクトでのみ機能しますが、VB プロジェクトでは変更できることに注意してください。

#Author: Tomasz Subik http://tsubik.com
#Date: 8/04/2012 7:35:55 PM
#Script: FindProjectMissingFiles
#Description: Looking for missing references to files in project config file
Param(
    [parameter(Mandatory=$false)]
    [alias("d")]
    $Directory,
    [parameter(Mandatory=$false)]
    [alias("s")]
    $SolutionFile
)


Function LookForProjectFile([System.IO.DirectoryInfo] $dir){
    [System.IO.FileInfo] $projectFile = $dir.GetFiles() | Where { $_.FullName.EndsWith(".csproj") } | Select -First 1

    if ($projectFile){
        $projectXmlDoc = [xml][system.io.file]::ReadAllText($projectFile.FullName)
        #[xml]$projectXmlDoc = Get-Content $projectFile.FullName
        $currentProjectPath = $projectFile.DirectoryName+"\"
        Write-Host "----Project found: "  $projectFile.Name

        $nm = New-Object -TypeName System.Xml.XmlNamespaceManager -ArgumentList $projectXmlDoc.NameTable
        $nm.AddNamespace('x', 'http://schemas.microsoft.com/developer/msbuild/2003')
        [System.Collections.ArrayList]$filesListedInProjectFile = $projectXmlDoc.SelectNodes('/x:Project/x:ItemGroup/*[self::x:Compile or self::x:Content or self::x:None]/@Include', $nm) | Select-Object Value

        CheckProjectIntegrity $dir $currentProjectPath $filesListedInProjectFile;
    }
    else { $dir.GetDirectories() | ForEach-Object { LookForProjectFile($_); } }
}

Function CheckProjectIntegrity([System.IO.DirectoryInfo] $dir,[string] $currentProjectPath,  [System.Collections.ArrayList] $filesListedInProjectFile ){
    $relativeDir = $dir.FullName -replace [regex]::Escape($currentProjectPath)
    $relativeDir = $relativeDir +"\"
    #check if folder is bin obj or something
    if ($relativeDir -match '(bin\\|obj\\).*') { return }

    $dir.GetFiles()  | ForEach-Object {
        $relativeProjectFile = $_.FullName -replace [regex]::Escape($currentProjectPath)
        $match = $false
        if(DoWeHaveToLookUpForThisFile($relativeProjectFile))
        {
            $idx = 0
            foreach($file in $filesListedInProjectFile)
            {
                if($relativeProjectFile.ToLower().Trim() -eq $file.Value.ToLower().Trim()){
                    $match = $true
                    break
                }
                $idx++
            }
            if (-not($match))
            {
                Write-Host "Missing file reference: " $relativeProjectFile -ForegroundColor Red
            }
            else
            {
                $filesListedInProjectFile.RemoveAt($idx)
            }
        }
    }
    #lookup in sub directories
    $dir.GetDirectories() | ForEach-Object { CheckProjectIntegrity $_ $currentProjectPath $filesListedInProjectFile }
}

Function DoWeHaveToLookUpForThisFile($filename)
{
    #check file extensions
    if ($filename -match '^.*\.(user|csproj|aps|pch|vspscc|vssscc|ncb|suo|tlb|tlh|bak|log|lib|sdf)$') { return $false }
    return $true    
}

Write-Host '######## Checking for missing references to files started ##############'
if($SolutionFile){
    [System.IO.FileInfo] $file = [System.IO.FileInfo] $SolutionFile
    $Directory = $file.Directory
}
LookForProjectFile($Directory)
Write-Host '######## Checking for missing references to files ends ##############'

使用例 (NuGet コンソールから実行する必要があります):

./FindProjectMissingFiles.ps1 -s $dte.Solution.FileName
于 2015-09-21T16:18:13.933 に答える
4

特定のルート フォルダーの下にあるプロジェクト ファイルから参照されるすべての cs ファイルを (再帰的に) 検索し、同じルート フォルダーの下にあるファイル システム内のファイルと比較する小さな C# コンソール アプリケーション。さまざまなファイル拡張子やさまざまなプロジェクト ファイル構造に適用できます (VS2008 でテストしました)。他のニーズに合わせていくつかの変更が必要になる場合がありますが、有用なベースを提供する必要があります。

using System.Collections.Generic;
using System.IO;
using System.Linq;
using System.Text.RegularExpressions;

namespace CompareProjectFilesWithFileSystem
{
    class Program
    {
        static void Main(string[] args)
        {
            string ext = "cs";
            string rootProjectFolder = @"C:\MySolutionRootFolder";
            Regex projectFileReferenceRegEx = new Regex(@"<(Compile|Content|None) Include=\""([^\""]+." + ext + @")\""( /)?>");

            // Files in file system:
            List<string> filesInFileSystem = new List<string>();
            filesInFileSystem.AddRange(Directory.GetFiles(rootProjectFolder, "*." + ext, SearchOption.AllDirectories));

            // Files referred from project files:
            string[] projectFilePaths = Directory.GetFiles(rootProjectFolder, "*.csproj", SearchOption.AllDirectories);
            List<string> filesReferredInProjectFiles = new List<string>();
            foreach (string projectFilePath in projectFilePaths)
            {
                string[] lines = File.ReadAllLines(projectFilePath);
                foreach (string line in lines)
                {
                    Match match = projectFileReferenceRegEx.Match(line);
                    if (match.Success)
                    {
                        filesReferredInProjectFiles.Add(Path.Combine(Path.GetDirectoryName(projectFilePath), match.Result("$2")));
                    }
                }
            }

            // Finding files referred from project files that are not contained in file system. And reversely.
            var list1 = filesReferredInProjectFiles.Except(filesInFileSystem).ToList();
            var list2 = filesInFileSystem.Except(filesReferredInProjectFiles).ToList();
        }
    }
}
于 2016-01-29T13:26:03.897 に答える
0

しばらく前にこのためのツールを書きました。こちらから入手できます。

于 2016-12-16T10:07:33.907 に答える
0

(Team Foundation Server がソース管理であると仮定します): ファイルがプロジェクトに追加され、ソース管理エクスプローラーに表示されるが、ソリューション エクスプローラーに表示されない場合は、「」を選択して手動でソース管理エクスプローラーに追加する必要があります。追加」、「既存のアイテム」。これは厄介な Visual Studio/TFS のバグで、私はその解決に 2 時間費やしました。

于 2014-01-23T19:09:23.597 に答える
0

これはすでに回答されていることは知っていますが、ここに私が使用するものがあります。

using System;
using System.IO;
using System.Text.RegularExpressions;
using System.Web;

namespace ProjectReferenceChecker
{
    class Program
    {
        static void Main(string[] args)
        {
            if (string.IsNullOrEmpty(args[0]))
                throw new Exception("Project file must be specified using in argument");

            var projectFile = new FileInfo(args[0]);

            var text = File.ReadAllText(projectFile.FullName);
            var regex = new Regex("<(Compile|Content|None) Include=\"([^\"]*)\".*>");

            foreach (Match match in regex.Matches(text))
            {
                var relativePath = match.Groups[2].ToString();
                relativePath = HttpUtility.HtmlDecode(relativePath);
                relativePath = HttpUtility.UrlDecode(relativePath);
                var targetPath = Path.Combine(projectFile.Directory.FullName, relativePath);
                if (!new FileInfo(targetPath).Exists)
                {
                    Console.WriteLine(relativePath);
                }
            }
        }
    }
}

これをコマンド ラインから呼び出すには (Windows):

  1. コンソール アプリを公開する
  2. そのフォルダーを C:\Program Files\[アプリ名] に移動します。
  3. スタートメニューを開き、「システム環境変数の編集」を探します
  4. [詳細設定] タブの下部にある [環境変数] をクリックします。
  5. 変数のみの上部ボックスまたはシステム全体の変数の下部ボックスのいずれかで、「パス」変数を​​見つけます。ダブルクリックして編集ウィンドウを開きます。
  6. 「新規」をクリックし、「C:\Program Files\[アプリ名]」と入力します。[OK] を押して、最後まで戻ります。開いている CMD または PowerShell セッションを閉じます。
  7. 新しい cmd/ps を再度開くと、どこからでも次のことができるはずです。
    [Your App Name].exe "C:\path\to\project.csproj"
于 2021-02-25T14:45:58.687 に答える
0

ファイルが見つからないためにコンパイルが失敗するという同様の状況がありました。以下にリンクされているこの投稿に出くわし、助けになりました。ビルドの開始時に実行される Visual Studio マクロの記述について説明します。

Visual Studio のプロジェクト/ソリューションにファイルが見つからない場合にエラー/警告を報告する

于 2012-10-11T18:28:34.883 に答える