Como adicionar uma árvore de diretórios existente a um projeto no Visual Studio?

824

A questão é realmente simples. Em vez de criar pastas no Visual Studio, crio uma estrutura de diretórios para o meu projeto no sistema de arquivos. Como incluo todas as pastas e arquivos em um projeto, mantendo a estrutura?

Se eu "Adicionar arquivo existente" em uma pasta chamada Serviços e navegar para um arquivo na estrutura de diretórios .. Serviços> Gerenciamento de contas> CreateAccount.cs, ele aparecerá no Visual Studio da seguinte forma: Serviços> CreateAccount.cs. Eu não quero isso.

Eu já tenho uma estrutura de diretórios inteira elaborada, pois imitamos nossos desenvolvedores de clientes usando a mesma estrutura para organização. Como adiciono todas as pastas e arquivos ao projeto no Visual Studio? Ou preciso fazer o que a maioria dos usuários da Microsoft faz e "tolerar" e recriar todas as pastas através do Visual Studio?

Brian Leahy
fonte

Respostas:

1438

Você precisa colocar sua estrutura de diretórios no diretório do projeto. E, em seguida, clique no ícone "Mostrar todos os arquivos" na parte superior da caixa de ferramentas do Solution Explorer. Depois disso, o diretório adicionado será exibido. Você precisará selecionar esse diretório, clicar com o botão direito do mouse e escolher "Incluir no projeto".

insira a descrição da imagem aqui

insira a descrição da imagem aqui

Gant
fonte
150
Existe uma maneira de fazer isso com um diretório (árvore) fora do diretório do projeto?
Imre
2
Existe uma maneira de fazer isso para uma pasta que NÃO é um subdiretório de onde está o seu projeto? ou seja: Faça com que E: \ ProjectX \ project.vcproj inclua a pasta E: \ Common * .cs ??
Matt Connolly
4
Quase funciona. Posso ver a árvore de diretórios e adicionar vários arquivos, mas isso não me permite adicionar um diretório inteiro, incluindo subárvores.
ManicBlowfish
5
O problema é que só funciona se você copiar a árvore de diretórios no seu projeto Visual através do Windows Explorer. Como você pode fazer isso se quiser apenas fazer referência a algumas pastas e arquivos contidos em outro projeto no seu computador?
Hico
5
Única maneira que eu conheço para fazer isso fora do projeto está usando um link simbólico ... ver a minha resposta: stackoverflow.com/a/26537736/835561
Edyn
77

Você também pode arrastar e soltar a pasta do Windows Explorer na janela da solução Visual Studio.

Todd Smith
fonte
14
Isso não funciona na minha instalação do VS 2010 no Vista Ultimate de 64 bits.
John Melville
13
Não, também não funciona na minha instalação do VS 2010 no Windows 7.
AH.
9
Confirmando isso não funciona no VS (modo não-Administrador) 2010 também
David Gardiner
9
Eu não acho que vocês estão fazendo certo. O VS 2010 suporta arrastar e soltar pastas. Faço isso o tempo todo para incluir meus kits de ferramentas. Você deve certificar-se de cair na árvore do projeto. O painel da solução e o próprio nó da solução não receberão a gota. O sistema operacional é irrelevante aqui, mas para quem duvida, eu uso o Windows 7 de 64 bits.
Gavin Williams
4
"Itens da solução" são diferentes de adicionar itens a um projeto. Os itens da solução são uma pasta especial na solução VS.
Todd Smith
53

No Visual Studio 2015, é assim que você faz.

Se você deseja incluir automaticamente todos os arquivos descendentes abaixo de uma pasta específica:

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

Isso pode ser restrito para incluir apenas arquivos no caminho especificado:

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

Ou mesmo apenas arquivos com uma extensão especificada:

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

Referência: http://jamesrpatterson.com/blog/automatic-include-in-project-for-visual-studio

Yuchen Zhong
fonte
3
Eu encontrei este útil porque eu poderia, então, incluir uma única tag para "copiar sempre em construção", em vez de precisar anotar cada arquivo individual (como foi o caso da resposta aceita)
Gordon Feijão
3
A IMO é uma das respostas mais úteis aqui.
Sinjai
Onde isso é adicionado? Como você obtém uma visualização XML no VS?
Matthew Dean
1
esta é a melhor solução quando você deseja adicionar uma pasta de grande hierarquia enquanto o Visual Studio não está respondendo e fica travado.
Gowtham Alan 29/05/19
1
É uma vergonha para a equipe do Microsoft VS
dejjub-AIS
33

Copiar e colar .

Para adicionar uma pasta, todos os subdiretórios e arquivos, também podemos copiar e colar. Por exemplo, podemos:

  1. Clique com o botão direito do mouse no Windows Explorer na pasta e Copie na pasta com muitos arquivos e pastas.

  2. Em seguida, no Visual Studio Solution Explorer, clique com o botão direito do mouse na pasta de destino e clique em Colar.

  3. Adicionar opcional ao TFS; Em seguida, na pasta superior, clique com o botão direito do mouse e faça check-in no TFS para fazer check-in de todas as subpastas e arquivos.

Catto
fonte
Isso funcionou para mim, mas arrastar e soltar não funcionou no VS14 e no Windows 10 pro.
Mona Jalal
1
arrastar e soltar pode não funcionar a menos que você estiver executando VS como administrador
RThomas
18

Você pode usar um link simbólico. Isso faz com que a modificação do arquivo em um projeto o modifique no outro (como na verdade é o mesmo arquivo).

Para fazer isso:

  1. Abra o prompt do cmd como administrador
  2. mklink / d [nome do diretório do projeto atual] [diretório em outro projeto para o qual ele deve apontar]

Isso tem suas desvantagens e armadilhas, mas eu o uso ocasionalmente para bibliotecas duplicadas que precisam de nomes diferentes.

Editar para Anoop: etapas para adicionar ao Visual Studio:

  1. Crie um link na pasta do projeto usando as etapas acima.
  2. No Visual Studio ... selecione o projeto no Solution Explorer.
  3. Na parte superior do Gerenciador de Soluções ... clique no botão Mostrar Todos os Arquivos (pode ser necessário clicar duas vezes se já estiver ativo).
  4. O link agora será exibido no seu projeto ... clique com o botão direito do mouse e escolha Incluir no projeto.

Estes são os passos que eu sigo e trabalha para alguns projetos diferentes.

Edyn
fonte
Isso não funciona! links simbólicos não são reconhecidos como pastas
Anoop K. Prabhu
1
@Anoop: adicionei etapas para mostrar como eu uso esse método. Por favor, tente.
Ed2
1
Está funcionando! Eu estava tentando criar um atalho clicando com o botão direito do mouse na pasta, em vez de usar o prompt de comando e, portanto, não funcionou. Após as etapas descritas acima, foi corrigido o problema. Obrigado
Anoop K. Prabhu
1
Nota: O mklink não funcionará em um sistema de arquivos FAT. É para NTFS.
Adrian
O controle de origem causará estragos nos links simbólicos. O Git precisa de privilégios de administrador ou apenas verifica o arquivo.
CAD bloke
13

No Visual Studio 2017, você alterna entre o Solution View e o Folder View . Eu acho que essa é uma opção melhor, porque manterá a solução mais limpa. Eu uso isso para editar arquivos .gitignore, .md etc.

Visão da solução e visão da pasta

Siavash Mortazavi
fonte
5
A questão é como adicionar uma pasta existente à solução, não apenas para exibir pastas.
CShark
1
Esta é realmente uma boa opção para ver a estrutura atual, abrir uma pasta no gerenciador de arquivos, etc. - mas infelizmente você não pode adicionar uma árvore de pastas existente na visualização de pastas. Isso só é possível na visualização da solução, como Gant a descreveu.
Matt
12

Para expandir a resposta de Yuchen , você pode incluir arquivos e caminhos como um link. Isso não é o mesmo que adicionar os itens existentes, porque não faz uma cópia extra na estrutura de pastas do seu projeto. É útil se você deseja que uma pasta / arquivo canônico etc seja usada em muitos lugares diferentes, mas deseja manter apenas uma versão / cópia dela.

Aqui está um exemplo do que você pode adicionar a um *.csprojarquivo para criar o link

<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) é uma variável de ambiente do Windows que eu defini, você pode usar as variáveis ​​de ambiente internas da mesma maneira.

O último grupo de exemplos é um monte de arquivos de conteúdo que eu preciso na saída final. Consulte https://stackoverflow.com/a/11808911/492 e outras respostas e links para obter mais informações.

Mais informações sobre o MSBuild em https://msdn.microsoft.com/en-us/library/bb629388.aspx

Cara de CAD
fonte
2
Essa deve ser a resposta!
Jurijs Kastanovs
4

Acho que encontrei uma maneira de fazer isso com o Compile Include = ". \ Code ***. Cs" O que eu queria era incluir código recursivamente na minha pasta Code.

Aqui está o exemplo do arquivo do projeto.

<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>
RJ Thompson
fonte
2

No Visual Studio 2013, não consegui que o "Incluir no Projeto" funcionasse ao clicar com o botão direito do mouse em uma pasta. O que funcionou foi expandir a pasta, selecionar todos os arquivos e escolher "Incluir no projeto". Foi muito entediante, pois você precisa fazer cada pasta uma por uma (mas pelo menos você pode fazer todos os arquivos de cada pasta de uma só vez), e parece armazenar o caminho do arquivo (você pode ver isso visualizando propriedades no arquivo e olhando para a opção "Caminho relativo".)

Espero usar isso para implantar alguns arquivos de dados em um projeto do Visual Studio Installer, e parece pegar os arquivos incluídos e preservar seus caminhos.

Malvineous
fonte
0

Pelo que sei, a única maneira de fazer isso no VS2010 é semelhante ao método de arrastar e soltar. Clique com o botão direito do mouse na solução à qual você deseja adicionar um projeto. O menu do aplicativo terá um item ... Ao abrir isso, você descobre que uma das opções é adicionar um projeto existente à solução.

Na caixa de diálogo exibida, navegue até a pasta que contém o arquivo de projeto da solução e selecione-o. O VS, como parte da importação desse arquivo de projeto, também importará o diretório inteiro e, presumo que todos os diretórios subordinados que fazem parte desse projeto.

Como isso requer um arquivo de projeto existente, não será impossível importar uma árvore de diretórios até que essa árvore tenha sido convertida em um projeto.

Fenton Smith
fonte
0

Não encontrei resposta para minha satisfação, então descobri a mim mesma.

Aqui está a resposta para você, se você deseja adicionar códigos-fonte externos ao seu projeto e não deseja copiar os códigos inteiros. Eu tenho muitas dependências em outros gits e eles são atualizados a cada hora, se não minuciosamente. Não consigo copiar todas as horas para sincronizar. Aqui está o que você precisa fazer.

Suponha que esta seja a estrutura:

/ root / projA / src

/ root / projA / inclui

/ root / projB / src

/ root / projB / inclui

/ root / yourProj / src

/ root / yourProj / includes

  1. Inicie sua solução VS.
  2. Clique com o botão direito do mouse no nome do projeto logo abaixo da Solução.
  3. Em seguida, clique no botão "Adicionar", "Novo filtro", coloque o nome "projA" para projA.
  4. Clique com o botão direito do mouse em "projA", clique em "Adicionar", "Novo filtro" e digite o nome "src"
  5. Clique com o botão direito do mouse em "projA", clique em "Adicionar", "Novo filtro" e digite o nome "inclui"
  6. Clique com o botão direito do mouse em "projA" / "src", clique em "Adicionar", "Item existente" e navegue até o / root / projA / src para adicionar todos os códigos-fonte ou um por um para os que você deseja.
  7. Faça o mesmo para "projA" / "includes"
  8. Faça o mesmo para projB. Agora, os projetos externos / existentes fora do seu estão presentes em sua solução / projeto. O VS irá compilá-los juntos. Aqui está um truque. Como o projA e o projB são pastas virtuais no seu projeto, o compilador pode não encontrar o projA / inclui.

  9. Se não encontrar o projA / includes, clique com o botão direito do mouse no projeto e selecione "Propriedades".

  10. Navegue para "C / C ++". Edite "Diretórios de inclusão adicionais", adicione seu projA / include como "../projA/includes", caminho relativo.

Uma ressalva, se houver arquivos de inclusão / cabeçalho duplicados, a opção "excluir do projeto" no "arquivo de cabeçalho" não funcionará realmente. É um bug no VS.

davidj
fonte
0

O Visual Studio 2017 e mais recentes suportam um novo .csprojformato leve que passou a ser conhecido como "formato SDK". Uma das várias vantagens desse formato é que, em vez de conter uma lista de arquivos e pastas incluídos , os arquivos são curingas incluídos por padrão. Portanto, com este novo formato, seus arquivos e pastas - adicionados no Explorer ou na linha de comando - serão recuperados automaticamente!

O .csprojarquivo de formato SDK atualmente trabalha com os seguintes tipos de projeto :

  • Projetos de biblioteca de classes

  • Aplicativos de console

  • Aplicativos Web do ASP.NET Core

  • Projetos do .NET Core de qualquer tipo

Para usar o novo formato, crie um novo projeto .NET Core ou .NET Standard. Como os modelos não foram atualizados para o .NET Framework completo, mesmo no Visual Studio 2019, para criar uma biblioteca de classes .NET, escolha o modelo .NET Standard Library e edite o arquivo do projeto para direcionar a versão da estrutura de sua escolha ( o novo formato de projeto de estilo pode ser editado no Visual Studio - clique com o botão direito do mouse no projeto no Gerenciador de Soluções e selecione "Editar arquivo de projeto"). Por exemplo:

<Project Sdk="Microsoft.NET.Sdk">
  <PropertyGroup>
    <TargetFramework>net46</TargetFramework>
  </PropertyGroup>
</Project>

Leitura adicional:

Stephen Kennedy
fonte