从Web项目中删除已删除文件的VS2010引用

12

我在VS2010背后删除了一些被Web项目引用为Content的图片文件夹中的图像。 在解决方案导航器中,这些文件现在显示为黄色警告图标,表示找不到文件。 刷新文件夹没有效果。 有没有办法告诉VS2010自动同步文件夹? VS网站项目默认会这样做。


1
行为差异是由于 Web 应用程序项目使用 MSBuild 基于项目系统来确定包含哪些文件(并列在 .csproj/.vbproj 中),而 Web 站点项目只查看文件系统。 - Jimmy
你可以构建项目,然后你会得到缺失文件的列表。基于这个列表,你能够检测缺失的文件并将它们移除。 - starikovs
6个回答

6
在Visual Studio中,进入缺失的文件,选择它们并按下del键(或右键选择Delete)。
保存项目,你就可以开始使用了。
正如你所注意到的,这不是自动完成的 - 项目文件需要与实际的文件系统同步。这在网站“项目”中不会发生,因为没有项目文件。

我本来希望不必这么做,但这就是生活。 - ATL_DEV
我本来希望不必这样做,但这就是现实,不幸的是在新的Visual Studio 2013中也是如此。下次请始终从项目/解决方案中删除,而不是直接在文件资源管理器中删除... - Langeleppel
1
在 VS 2015 中(不确定旧版本是否有),您可以使用项目树上方的搜索栏来过滤,然后多选并一次性删除。但是,这仅适用于需要删除的所有文件具有相似名称的情况。 - agradl

3
我已经创建了一个PowerShell脚本来解决这个问题。
function ExtractInclude ($line)
{
    if ($line  -like  '*Content Include=*') {
        return $line.Split('"') | select -Skip 1 | select -First 1
    }
}

function RemoveMissingInclude ([string]$path, [bool]$report) {
    $reader = [System.IO.File]::OpenText($path)
    $projectPath = (Split-Path $path) + "/"

    try {
        for() {
            $line = $reader.ReadLine()
            if ($line -eq $null) { break }

            $pathInclude = ExtractInclude($line)

            if ($report) {
                if ($pathInclude -ne "") {
                    if (-not (Test-Path "$projectPath$pathInclude")) { $pathInclude }
                } 
            } else {
                if ($pathInclude -ne "") {
                    if (Test-Path "$projectPath$pathInclude") { $line }
                } else {
                    $line
                }
           }
        }
    }
    finally {
        $reader.Close()
    }
}

只需运行以下命令即可创建清理后的项目文件:
RemoveMissingInclude -path "D:\path\name.csproj" | Out-File D:\path\nameClean.csproj

此博客文章中可以找到更多相关信息:http://devslice.net/2017/06/remove-missing-references-visual-studio/


这很好,但它没有考虑“<content”标签可能有多行。 - Pedro
我真的希望能够理解PowerShell。有人声称它像C#,但我不同意。它有很多Bash的影子。我不明白为什么糟糕的想法会被继续传承。 - ATL_DEV
我真希望能够理解PowerShell。有人说它像C#,但我不同意。它更像是加入了一些bash的元素。我无法理解为什么糟糕的想法还在继续传播。 - ATL_DEV

3
我在VS 2015中遇到了这个问题。Web项目中的文件都丢失了,所以不想一个一个去寻找。
最快的方法是:排除所有文件/文件夹,然后再包含它们
具体步骤如下:
  1. 打开“解决方案资源管理器” -> 选择所有的文件和文件夹 -> 右键点击 -> “从项目中排除”
  2. 打开“解决方案资源管理器” -> 点击“显示所有文件”
  3. 打开“解决方案资源管理器” -> 选择所有的文件和文件夹 -> 右键点击 -> “包括在项目中”

5
请注意,这种方法的缺点是您将包括先前明确排除的文件。 - Chris

0

回答 Nov-2018,因为像我这样的人可能会遇到这个问题。

问题:

我已备份了项目中的一些文件夹。

由于文件是原始文件的副本,所以函数定义被引用。

现在当我尝试从函数调用打开函数定义时,会打开备份文件夹中的函数定义。

在删除备份文件夹后,它显示错误:xyz.php 文件未找到,请创建一个。

解决方案:

进入资源管理器中的文件夹,

点击刷新图标。

重新启动 Visual Studio Code。


0

在资源管理器中打开项目,找到扩展名为“.vcxproj”的文件,并从中删除您想要删除的文件,然后您就可以继续进行了。


-1
我为此制作了一个非常简单的控制台应用程序:
using System;
using System.IO;
using System.Collections.Generic;

namespace CleanProject
{
    class Program
    {
        static void Main(string[] args)
        {
            var newFile = new List<string>();
            if (args.Length == 0)
            {
                Console.WriteLine("Please specify the project full path as an argument");
                return;
            }

            var projFile = args[0];
            if (!File.Exists(projFile))
            {
                Console.WriteLine("The specified project file does not exist: {0}", projFile);
                return;
            }

            if (!projFile.ToLowerInvariant().EndsWith(".csproj"))
            {
                Console.WriteLine("The specified does not seem to be a project file: {0}", projFile);
                return;
            }

            Console.WriteLine("Started removing missing files from project:", projFile);

            var newProjFile = Path.Combine(Path.GetDirectoryName(projFile), Path.GetFileNameWithoutExtension(projFile) + ".Clean.csproj");
            var lines = File.ReadAllLines(projFile);
            var projectPath = Path.GetDirectoryName(projFile);
            for(var i = 0; i < lines.Length; i++)
            {
                var line = lines[i];
                if (!line.Contains("<Content Include=\"") && !line.Contains("<None Include=\""))
                {
                    newFile.Add(line);
                }
                else
                {
                    var start = line.IndexOf("Include=\"") + "Include=\"".Length;
                    var end = line.LastIndexOf("\"");
                    var path = line.Substring(start, end - start);
                    if (File.Exists(Path.Combine(projectPath, path)))
                    {
                        newFile.Add(line);
                    }
                    else
                    {
                        if (!line.EndsWith("/>")) // I'm assuming it's only one line inside the tag
                            i += 2;
                    }
                }
            }
            File.WriteAllLines(newProjFile, newFile);

            Console.WriteLine("Finished removing missing files from project.");
            Console.WriteLine("Cleaned project file: {0}", newProjFile);
        }
    }
}

https://github.com/woodp/remove-missing-project-files


网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接