【问题标题】:How do I add an existing directory tree to a project in Visual Studio?如何将现有目录树添加到 Visual Studio 中的项目?
【发布时间】:2010-09-28 09:27:00
【问题描述】:

这个问题真的很简单。我没有在 Visual Studio 中创建文件夹,而是在文件系统上为我的项目创建了一个目录结构。如何在项目中包含所有文件夹和文件,同时保持结构?

如果我在名为 Services 的文件夹上“添加现有文件”并导航到目录结构中的文件 ..Services > AccountManagement > CreateAccount.cs,它在 Visual Studio 中显示如下:Services > CreateAccount.cs。我不想要这个。

我已经制定了一个完整的目录结构,因为我正在模仿我们的客户开发人员使用相同的组织结构。如何在 Visual Studio 中将所有文件夹和文件添加到项目中?还是我必须像大多数 Microsoft 用户一样“忍受”并通过 Visual Studio 重新创建每个文件夹?

【问题讨论】:

标签: visual-studio


【解决方案1】:

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

【讨论】:

  • 有没有办法使用项目目录外部的目录(树)来做到这一点?
  • 有没有办法为不是您项目所在子目录的文件夹执行此操作?即: E:\ProjectX\project.vcproj 是否包含文件夹 E:\Common*.cs ??
  • 几乎可以工作。我可以看到目录树,并添加多个文件,但它不会让我添加包括子树在内的整个目录。
  • 问题是它只有在通过 Windows 资源管理器复制 Visual 项目中的目录树时才有效。如果您只想引用计算机上其他项目中包含的一些文件夹和文件,该怎么办?
  • 我知道在项目之外执行此操作的唯一方法是使用符号链接...查看我的答案:stackoverflow.com/a/26537736/835561
【解决方案2】:

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

【讨论】:

  • 这不适用于我在 Vista Ultimate 64 位上安装 VS 2010。
  • 不,在我在 Windows 7 上安装的 VS 2010 中也不起作用。
  • 确认这在 VS 2010(非管理员模式)中也不起作用
  • 我不认为你们做得对。 VS 2010 确实支持文件夹拖放。我一直这样做是为了包含我的工具包。您必须确保放入项目树中。解决方案面板和解决方案节点本身不会收到掉落物。操作系统在这里无关紧要,但对于怀疑者,我使用的是 Windows 7 64 位。
  • “解决方案项”与向项目中添加项不同。解决方案项是 VS 解决方案中的一个特殊文件夹。
【解决方案3】:

据我所知,在 VS2010 中执行此操作的唯一方法类似于拖放方法。右键单击要添加项目的解决方案。应用程序菜单将有一个添加 ... 项。打开它,您会发现其中一个选项是将现有项目添加到解决方案中。

在打开的对话框中,导航到包含解决方案项目文件的文件夹并选择它。作为导入该项目文件的一部分,VS 还将导入整个目录,并且我假设任何属于该项目的从属目录。

由于这确实需要一个现有的项目文件,因此在将目录树转换为项目之前,导入目录树并非不可能。

【讨论】:

    【解决方案4】:

    复制和粘贴

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

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

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

    3. 可选添加到 TFS;然后在顶部文件夹中右键单击并签入 TFS 以签入所有子文件夹和文件。

    【讨论】:

    • 这对我有用,但拖放在 VS14 和 Windows 10 专业版中不起作用。
    • 除非您以管理员身份运行 VS,否则拖放可能不起作用
    【解决方案5】:

    您可以使用符号链接。这使得在一个项目中修改文件会在另一个项目中修改它(因为它实际上是同一个文件)。

    为此:

    1. 以管理员身份打开 cmd 提示符
    2. mklink /d [当前项目目录名] [应该指向的其他项目中的目录]

    这有它的缺点和陷阱,但我有时会将它用于需要不同名称的重复库。

    编辑 Anoop: 添加到 Visual Studio 的步骤:

    1. 使用上述步骤在项目文件夹中创建链接。
    2. 在 Visual Studio 中...在解决方案资源管理器中选择项目。
    3. 在解决方案资源管理器的顶部...单击“显示所有文件”按钮(如果已激活,可能需要单击两次)。
    4. 该链接现在将显示在您的项目中...右键单击并选择包含在项目中。

    这些是我遵循的步骤,适用于几个不同的项目。

    【讨论】:

    • 注意:mklink 不能在 FAT 文件系统上工作。它适用于 NTFS。
    • 源代码控制将对符号链接造成严重破坏。 Git 需要管理员权限或只签入文件。
    • @CAD 你能详细说明一下吗?我倾向于避免使用符号链接,所以我没有尝试将它们与 Git 一起使用,但我知道 Git 安装程序提到了符号链接支持。
    • @Sinjai 一些 GUI git 客户端会将符号链接转换为实际文件(我猜是因为它们不以管理员权限运行)。我避免在 git 中使用符号链接,主要是因为它可能不一致。此外,您不能确定符号链接目标是否在 git repo 被克隆到的所有机器上。我相信 git repo 应该是自包含的,没有神秘的依赖关系。
    【解决方案6】:

    在 Visual Studio 2013 中,右键单击文件夹时无法让“包含在项目中”工作。起作用的是扩展文件夹,选择所有文件,然后选择“包含在项目中”。这很繁琐,因为您必须一个一个地处理每个文件夹(但至少您可以一次完成每个文件夹中的所有文件),并且它似乎存储了文件路径(您可以通过查看文件的属性来查看并查看“相对路径”选项。)

    我希望使用它在 Visual Studio 安装程序项目中部署一些数据文件,它似乎会拾取包含的文件并保留它们的路径。

    【讨论】:

      【解决方案7】:

      在 Visual Studio 2015 中,您就是这样做的。

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

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

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

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

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

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

      【讨论】:

      • 我发现这很有帮助,因为我可以为“始终在构建时复制”包含一个标签,而不是需要注释每个单独的文件(就像接受的答案中的情况一样)
      • 当您想要在 Visual Studio 没有响应并挂起时添加大型层次结构文件夹时,这是最佳解决方案。
      • 对于那些想在哪里添加它的人,它是文件.csproj 文件。例如,Product.Feature.Web.csproj。您需要添加类似 ` 之类的内容。
      【解决方案8】:

      要扩展Yuchen's answer,您可以包含文件和路径作为链接。这与添加现有项目不同,因为它不会在项目的文件夹结构中创建额外的副本。如果您希望在许多不同的地方使用一个规范的文件夹/文件等,但您只想维护它的一个版本/副本,这将非常有用。

      这里是您可以添加到 *.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://stackoverflow.com/a/11808911/492 和其他答案和链接。

      更多 MSBuild 信息https://msdn.microsoft.com/en-us/library/bb629388.aspx

      【讨论】:

        【解决方案9】:

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

        这是项目文件示例。

        <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>
        

        【讨论】:

          【解决方案10】:

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

          【讨论】:

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

          我没有找到令我满意的答案,所以我自己想通了。

          如果您想将外部源代码添加到您的项目并且不想复制整个代码,这里就是您的答案。我对其他 git 有很多依赖,它们每小时更新一次,如果不是每分钟更新一次。我不能每小时复制一次来同步。这是您需要做的。

          假设这是结构:

          /root/projA/src

          /root/projA/包含

          /root/projB/src

          /root/projB/包含

          /root/yourProj/src

          /root/yourProj/includes

          1. 开始您的 VS 解决方案。
          2. 右键单击解决方案正下方的项目名称。
          3. 然后点击“添加”、“新建过滤器”,将projA命名为“projA”。
          4. 右击“projA”,点击“添加”,“新建过滤器”,输入名称“src”
          5. 右击“projA”,点击“Add”,“New Filter”,输入名称“includes”
          6. 右键单击“projA”/“src”,单击“添加”,“现有项目”,然后浏览到 /root/projA/src 以添加所有源代码或一一添加您想要的源代码。
          7. 对“projA”/“includes”执行相同操作
          8. 对 projB 执行相同操作。 现在,您的外部/现有项目出现在您的解决方案/项目中。 VS 会将它们编译在一起。 这是一个技巧。由于 projA 和 projB 是您项目下的虚拟文件夹,因此编译器可能找不到 projA/includes。

          9. 如果没有找到 projA/includes,则右键单击项目,选择“属性”。

          10. 导航到“C/C++”。编辑“其他包含目录”,添加您的 projA/include,例如“../projA/includes”,相对路径。

          一个警告,如果有重复的包含/头文件,“头文件”上的“从项目中排除”实际上不起作用。这是VS中的一个错误。

          【讨论】:

            【解决方案12】:

            Visual Studio 2017 和更新版本支持一种新的轻量级.csproj 格式,该格式已被称为“SDK 格式”。这种格式的几个优点之一是,文件不是包含包含的文件和文件夹列表,而是默认包含通配符。 因此,使用这种新格式,您在资源管理器中或命令行中添加的文件和文件夹将被自动拾取!

            SDK格式.csproj文件currently works with the following project types

            • 类库项目

            • 控制台应用

            • 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>
            

            进一步阅读:

            【讨论】:

              猜你喜欢
              • 1970-01-01
              • 2020-12-22
              • 1970-01-01
              • 1970-01-01
              • 2011-03-04
              • 1970-01-01
              • 1970-01-01
              • 1970-01-01
              • 1970-01-01
              相关资源
              最近更新 更多