Copiar arquivos para a pasta do aplicativo em tempo de compilação

93

Se eu tiver alguns arquivos que deseja copiar do meu projeto para a .\bin\debug\pasta na compilação, parece que tenho que colocá-los na raiz do projeto. Colocá-los em uma subpasta parece copiá-los para a .\bin\debug\pasta na mesma estrutura em que estão armazenados.

Existe alguma maneira de evitar isso?

Só para ficar claro: se eu tiver um MyFirstConfigFile.txte MySecondConfigFile.txtem uma ConfigFilespasta e definir sua cópia para saída como cópia ... , eles aparecerão na .\bin\debug\ConfigFiles\pasta. Eu quero que eles apareçam na .\bin\debug\pasta.

Andrew Ducker
fonte

Respostas:

90

Você pode fazer isso com um evento pós-construção. Defina os arquivos para nenhuma ação na compilação e, em seguida, na macro, copie os arquivos para o diretório desejado.

Aqui está uma macro pós-compilação que acho que funcionará copiando todos os arquivos em um diretório chamado Configuração para a pasta de compilação raiz:

copy $(ProjectDir)Configuration\* $(ProjectDir)$(OutDir)
JoshBerke
fonte
1
Para o destino, não deveria ser $ (ProjectDir) \% (OutDir)?
Ed Greaves
11
A macro correta e testada (Vs2010) é: cópia "$ (ProjectDir) Firebird \ firebird_bin *" "$ (ProjectDir) $ (OutDir)"
Eric Bole-Feysot
Você também pode fazer um arquivo relativo para a saída: copiar "$ (ProjectDir) Firebird \ firebird_bin *" "$ (OutDir)"
Elendurwen
3
Eu acho que o uso de aspas é necessário:copy "$(ProjectDir)subfolder_name\"* "$(ProjectDir)$(OutDir)"
tedebus
1
No MSVS2017 (15.4), deveria ser $(OutDir)(ou seja, sem $(ProjectDir)) parece ... senão você obterá erros de caminho duplo
JHBonarius
51

Você pode usar uma tarefa MSBuild em seu csproj, assim.

Edite seu arquivo csproj

  <Target Name="AfterBuild">
    <Copy SourceFiles="$(OutputPath)yourfiles" DestinationFolder="$(YourVariable)" ContinueOnError="true" />
  </Target>
Jhonny D. Cano -Leftware-
fonte
Esta é a melhor solução, pois você pode usar curingas para copiar muitos arquivos, e eles não precisam estar no projeto.
Chris Bordeman
37

Você também pode colocar os arquivos ou links na raiz do gerenciador de soluções e definir as propriedades dos arquivos:

Build action = Content

e

Copy to Output Directory = Copy if newer (por exemplo)

Para obter um link, arraste o arquivo do Windows Explorer para o Solution Explorer, mantendo pressionadas as teclas shift e control.

insira a descrição da imagem aqui

Georg
fonte
3
Isso preservará o caminho relativo original, que não é aceitável para o OP
jlee
Se você colocar o arquivo no nó de nível superior do seu projeto, ele será copiado diretamente para a pasta de saída $ (OutputPath).
Georg
3

copiar de subpasta para subpasta

 if not exist "$(ProjectDir)$(OutDir)subfolder" mkdir "$(ProjectDir)$(OutDir)subfolder"

 copy "$(ProjectDir)subfolder\"  "$(ProjectDir)$(OutDir)subfolder\"
Ehsäɳ Khʌɳ
fonte
7
Bem-vindo ao StackOverflow e obrigado por contribuir. Você respondeu a uma pergunta muito antiga que já tem um monte de respostas altamente votadas. Se você acha que sua resposta é útil, além das respostas votadas positivamente existentes, você deve adicionar uma pequena explicação de por que sua resposta resolve o problema e por que é melhor / diferente das outras.
Matthijs Wessels
3

Pessoalmente, prefiro assim.

Modifique o .csprojpara adicionar

<ItemGroup>
    <ContentWithTargetPath Include="ConfigFiles\MyFirstConfigFile.txt">
      <CopyToOutputDirectory>PreserveNewest</CopyToOutputDirectory>
      <TargetPath>%(Filename)%(Extension)</TargetPath>
    </ContentWithTargetPath>
</ItemGroup>
Jérôme MEVEL
fonte
1
Na minha opinião, muito melhor do que um evento pós-construção. Obrigado!
khlr
Isso não é o mesmo que clicar com o botão direito do mouse no projeto e selecionar "Adicionar | Item Existente" no Gerenciador de Soluções e definir a propriedade Arquivo "Copiar para o Diretório de Saída" como "Copiar se mais recente". Não há necessidade de modificar o XML diretamente.
Antony Booth
@AntonyBooth depois de um tempo, você perceberá que é sempre mais fácil entender o que está acontecendo e modificar o código diretamente, em vez de aprender como fazer a mesma coisa com seu IDE. Hoje você está usando o Visual Studio, amanhã pode ser JetBrains Rider e depois de amanhã VS Code. No final, é sempre melhor dominar uma linguagem do que um IDE. PS: Não sei se o que você descreve é ​​igual, pois só sei fazer em XML, muito melhor assim.
Jérôme MEVEL
1

Você deseja usar um evento Post-Build em seu projeto. Você pode especificar a saída lá e há valores de macro para coisas usadas com frequência, como caminho do projeto, nome do item, etc.

Mark Sherretta
fonte
0

Você pode usar o evento PostBuild do projeto. Após a conclusão da compilação, você pode executar um arquivo em lote do DOS e copiar os arquivos desejados para a pasta desejada.

Kirtan
fonte
0

Eu encontrei esta pergunta procurando por "copiar arquivos para a pasta do aplicativo em tempo de compilação". OP parece já ter isso classificado, mas se você não fizer isso:

No Visual Studio, clique com o botão direito do mouse no arquivo, selecione as propriedades e altere a opção 'copiar para saída' para 'sempre'. Consulte http://msdn.microsoft.com/en-us/library/0c6xyb66.aspx

Coronel Panic
fonte
5
OP pede cópia para compilar o diretório sem manter a estrutura de diretório relativa à localização do arquivo copiado
Áxel Costas Pena