如何将现有的目录树添加到Visual Studio项目中?

912
问题其实很简单。我不是在 Visual Studio 中创建文件夹,而是在文件系统中为我的项目创建一个目录结构。如何将所有文件夹和文件都包含到项目中,并保持原来的结构?
如果我在名为 Services 的文件夹上使用“添加现有文件”并导航到目录结构中的文件 .. Services > AccountManagement > CreateAccount.cs,则在 Visual Studio 中显示为 Services > CreateAccount.cs。我不想要这个。
我已经整个目录结构都设计好了,因为我正在模仿我们客户端开发人员使用相同的结构进行组织。如何在 Visual Studio 中添加所有文件夹和文件到项目中?或者,我必须像大多数 Microsoft 用户一样“忍受它”,并通过 Visual Studio 重新创建每个文件夹吗?

在2019年,根据Stack Overflow的调查数据,最受欢迎的编程语言前五名分别是JavaScript、Python、Java、C#和PHP。 - user2864740
13个回答

1563
您需要将目录结构放在您的项目目录中。然后在解决方案资源管理器工具箱顶部单击“显示所有文件”图标。之后,添加的目录将会显示出来。接下来,您需要选择此目录,右键单击并选择“包含到项目中”。

输入图像描述

输入图像描述


184
有没有办法使用项目目录之外的目录(树)来完成这个? - imre
4
有没有办法添加一个不是你项目子目录的文件夹?例如:让 E:\ProjectX\project.vcproj 包含文件夹 E:\Common*.cs ? - Matt Connolly
4
几乎可以使用。我可以看到目录树并添加多个文件,但无法添加整个包括子目录的目录。 - ManicBlowfish
6
问题在于,只有通过Windows资源管理器复制Visual项目中的目录树,该方法才有效。如果你只想引用计算机上另一个项目中包含的一些文件夹和文件,该怎么办? - hico
7
我唯一知道在项目外进行此操作的方法是使用符号链接...请查看我的答案:https://dev59.com/EHRC5IYBdhLWcg3wKtv2#26537736。 - Edyn
显示剩余9条评论

90

您还可以从Windows Explorer中拖放文件夹到Visual Studio解决方案窗口中。


17
在我的Vista Ultimate 64位上安装的VS 2010中,这无法正常工作。 - John Melville
15
不,这个方法在我安装在Windows 7上的VS 2010中也不起作用。 - AH.
11
确认在 VS 2010(非管理员模式)中也不起作用。 - David Gardiner
12
我认为你们做错了。VS 2010支持文件夹拖放,我经常这样做来包含我的工具包。你需要确保将其拖放到项目树中。解决方案面板和解决方案节点本身都不会接收拖放。操作系统在这里无关紧要,但对于怀疑者,我使用的是Windows 7 64位。 - Gavin Williams
4
“解决方案项”不同于向项目添加项。 “解决方案项”是VS解决方案中的一个特殊文件夹。 - Todd Smith
显示剩余9条评论

66

在 Visual Studio 2015 中,以下是如何完成此操作。

如果您想自动包含特定文件夹下的所有后代文件:

<Content Include="Path\To\Folder\**" />

这可以被限制在指定路径中仅包含文件:

<Content Include="Path\To\Folder\*.*" />

甚至只有特定扩展名的文件:

<Content Include="Path\To\Folder\*.jpg" >

4
我认为这很有用,因为我只需添加一个标签“始终复制”即可,而不需要对每个文件进行注释(就像被接受的答案所述)。 - Gordon Bean
2
当您想要添加大型层次结构文件夹而Visual Studio无响应并挂起时,这是最佳解决方案。 - Gowtham Alan
5
对于那些想知道在哪里添加此内容的人,需要编辑.csproj文件,例如Product.Feature.Web.csproj。您需要添加类似于<ItemGroup><Content Include="Path\To\Folder\**" /></ItemGroup>的内容。 - Gene Parcellano
1
你在VS 2022中如何做到这些? - Alexander
2
我在VS2019中尝试了这个,结果得到了警告:VC项目不支持项目项中的通配符,可能会导致Visual Studio IDE出现意外行为、不稳定和性能下降。请参考https://aka.ms/cpp/projectwildcards以获取支持的选项。 - Gabriel Devillers
@GabrielDevillers 你应该添加 <PropertyGroup><ReplaceWildcardsInProjectItems>true</ReplaceWildcardsInProjectItems></PropertyGroup> ,然后你就可以使用通配符 <ItemGroup><Text Include="wild\card\\**"></ItemGroup> 。在项目重新加载后,这个通配符将自动替换为明确的文件路径。(来源:https://learn.microsoft.com/en-us/cpp/build/reference/vcxproj-files-and-wildcards?view=msvc-170#list-all-items-explicitly) - undefined

34

复制和粘贴

要添加一个文件夹、所有子目录和文件,我们也可以使用复制和粘贴。例如:

  1. 在Windows资源管理器中,右键单击文件夹并复制包含许多文件和文件夹的文件夹。

  2. 然后在Visual Studio解决方案资源管理器中,右键单击目标文件夹并单击粘贴。

  3. 可选:将其添加到TFS。然后在顶层文件夹中,右键单击并检入到TFS以检入所有子文件夹和文件。


这对我有用,但在VS14和Windows 10专业版中拖放无法工作。 - Mona Jalal
1
拖放可能无法正常工作,除非您以管理员身份运行VS。 - RThomas
这在2023年的VS2022中对我起作用,当添加身份脚手架崩溃时,我需要从新创建的骨架解决方案中导入目录结构。 - camelCase
这在2023年的VS2022中对我起了作用,当我添加身份脚手架时崩溃了,我需要从一个新创建的骨架解决方案中导入一个目录结构。 - undefined

20
您可以使用符号链接。这会使您在一个项目中修改文件时也会在另一个项目中修改它(因为它实际上是同一个文件)。
要做到这一点:
1. 以管理员身份打开cmd提示符 2. mklink /d [当前项目目录名称] [应指向的其他项目目录]
这有其缺点和风险,但我偶尔用于需要不同名称的重复库。
Anoop的编辑: 添加到Visual Studio的步骤:
1. 使用上述步骤在项目文件夹中创建链接。 2. 在Visual Studio中...选择解决方案资源管理器中的项目。 3. 在解决方案资源管理器的顶部...单击“显示所有文件”按钮(如果已经激活,则可能需要单击两次)。 4. 链接现在将显示在您的项目中...右键单击并选择“包含在项目中”。
这是我遵循的步骤,适用于几个不同的项目。

1
注意:mklink在FAT文件系统上无法工作。它只适用于NTFS。 - Adrian
源代码控制会对符号链接造成混乱。Git 需要管理员权限才能检查文件或者提交文件。 - CAD bloke
@CAD 能否详细说明一下?我通常避免使用符号链接,所以我没有尝试在 Git 中使用它们,但我知道 Git 安装程序提到了符号链接支持。 - Sinjai
@Sinjai 一些GUI git客户端会将符号链接转换为实际文件(我猜测是因为它们没有以管理员权限运行)。我通常避免在git中使用符号链接,因为它可能不一致。此外,您无法确定符号链接目标是否在克隆到的所有机器上都存在于git仓库中。我认为git仓库应该是自包含的,没有神秘的依赖关系。 - CAD bloke

17

针对 Yuchen的回答, 你可以将文件和路径作为链接包含在其中。这与添加现有项目不同,因为它不会在你的项目文件夹结构中创建额外的副本。如果你想让一个规范的文件夹/文件等在很多不同的地方使用,但只想维护一个版本/副本,那么这是非常有用的。

以下是一个示例,演示如何将其添加到*.csproj 文件中来创建该链接:

<Compile Include="$(Codez)\z.Libraries\Common\Strings\RegexExtensions.cs">
    <Link>Helpers\RegexExtensions.cs</Link>
</Compile>

<Compile Include="..\..\z.Libraries\MoreLINQ\MoreLinq\ExceptBy.cs">
    <Link>Helpers\ExceptBy.cs</Link>
</Compile>

<Content Include="C:\Codez\Libs\Folder\OtherFolder\**\*.*">
    <Link>%(RecursiveDir)%(Filename)%(Extension)</Link>
    <CopyToOutputDirectory>PreserveNewest</CopyToOutputDirectory>
</Content>

$(Codez) 是我定义的 Windows 环境变量,您可以像使用内置环境变量一样使用它。

最后一个示例组是我在最终输出中需要的一组内容文件。有关此的更多信息,请参见 https://dev59.com/z3M_5IYBdhLWcg3wp0wX#11808911 和其中的其他答案和链接。

有关更多 MSBuild 信息,请访问 https://msdn.microsoft.com/en-us/library/bb629388.aspx


16
在Visual Studio 2017中,你可以在“解决方案视图”和“文件夹视图”之间来回切换。我认为这是一个更好的选择,因为它会使解决方案更加清晰。我使用它来编辑.gitignore、.md文件等。

Solution View and Folder View


9
问题是如何将现有文件夹添加到解决方案中,而不仅仅是查看文件夹。 - CShark
1
这是一个非常好的选项,可以查看实际结构,在文件资源管理器中打开文件夹等 - 但不幸的是,您无法从文件夹视图中添加现有的文件夹树。正如Gant所描述的那样,这只在解决方案视图中才可能。 - Matt

4

我认为我找到了一种方法,可以使用Compile Include=".\Code***.cs"来实现这一点。我想要的是在我的Code文件夹下递归地包含代码。

这是项目文件的示例。

<Project xmlns="http://schemas.microsoft.com/developer/msbuild/2003" ToolsVersion="15.0" DefaultTargets="BuildTarget">
    <PropertyGroup>
        <OutputType>Library</OutputType>
    </PropertyGroup>
    <PropertyGroup>
        <StartupObject />
    </PropertyGroup>
    <PropertyGroup>
        <RootNamespace>Autogen</RootNamespace>
    </PropertyGroup>
    <ItemGroup>
        <Compile Remove="@(Compile)" />
        <Compile Include=".\Code\**\*.cs" />
    </ItemGroup>
    <Target Name="BuildTarget">
        <Message Text="Build selected" Importance="high"/>
    </Target>
</Project>

2
Visual Studio 2017及更高版本支持一种新的轻量级.csproj格式,被称为“SDK格式”。该格式的几个优点之一是,文件不再需要手动列出,而是默认使用通配符包含。因此,使用这种新格式时,您在资源管理器或命令行中添加的文件和文件夹都将自动被识别!SDK格式的.csproj文件目前适用于以下项目类型:类库项目、控制台应用程序、ASP.NET Core Web应用程序以及任何类型的.NET Core项目。
要使用新的格式,请创建一个新的.NET Core或.NET Standard项目。即使在Visual Studio 2019中,模板也没有针对完整的.NET Framework进行更新,因此要创建一个.NET类库,请选择.NET Standard Library模板,然后编辑项目文件以针对您选择的框架版本(新样式项目格式可以在Visual Studio内部进行编辑 - 只需右键单击解决方案资源管理器中的项目,然后选择“编辑项目文件”)。例如:
<Project Sdk="Microsoft.NET.Sdk">
  <PropertyGroup>
    <TargetFramework>net46</TargetFramework>
  </PropertyGroup>
</Project>

进一步阅读:

2
在Visual Studio 2013中,右键单击文件夹时无法使用“包括在项目中”功能。解决方法是展开文件夹,选择所有文件,然后选择“包括在项目中”。这很繁琐,因为您必须一个一个地处理每个文件夹(但至少可以一次性处理每个文件夹中的所有文件),并且它似乎存储文件路径(您可以通过查看文件属性并查看“相对路径”选项来查看此信息)。
我希望将其用于部署一些数据文件到Visual Studio Installer项目中,并且它似乎会收集所包含的文件并保留它们的路径。

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