Copiar archivos en la carpeta de la aplicación en tiempo de compilación

95

Si tengo algunos archivos que quiero copiar de mi proyecto a la .\bin\debug\carpeta de compilación, entonces parece que tengo que ponerlos en la raíz del proyecto. Ponerlos en una subcarpeta parece copiarlos en la .\bin\debug\carpeta en la misma estructura en la que están almacenados.

Hay alguna manera de evitar esto?

Para que quede claro: si tengo un MyFirstConfigFile.txty MySecondConfigFile.txten una ConfigFilescarpeta y configuro su Copia en Salida para que sea Copia ... , entonces aparecen en la .\bin\debug\ConfigFiles\carpeta. Quiero que aparezcan en la .\bin\debug\carpeta.

Andrew Ducker
fuente

Respuestas:

93

Puede hacer esto con un evento posterior a la construcción. Establezca los archivos en ninguna acción durante la compilación, luego, en la macro, copie los archivos al directorio que desee.

Aquí hay una macro de compilación posterior que creo que funcionará copiando todos los archivos en un directorio llamado Configuración a la carpeta de compilación raíz:

copy $(ProjectDir)Configuration\* $(ProjectDir)$(OutDir)
JoshBerke
fuente
1
Para el destino, ¿no debería ser $ (ProjectDir) \% (OutDir)?
Ed Greaves
11
La macro correcta y probada (Vs2010) es: copiar "$ (ProjectDir) Firebird \ firebird_bin *" "$ (ProjectDir) $ (OutDir)"
Eric Bole-Feysot
También puede crear un archivo relativo para la salida: copie "$ (ProjectDir) Firebird \ firebird_bin *" "$ (OutDir)"
Elendurwen
3
Creo que el uso de comillas es necesario:copy "$(ProjectDir)subfolder_name\"* "$(ProjectDir)$(OutDir)"
tedebus
1
En MSVS2017 (15.4) debería ser $(OutDir)(es decir, sin $(ProjectDir)) parece ... de lo contrario, obtiene errores de doble ruta
JHBonarius
51

Puede usar una tarea de MSBuild en su csproj, así.

Edite su archivo csproj

  <Target Name="AfterBuild">
    <Copy SourceFiles="$(OutputPath)yourfiles" DestinationFolder="$(YourVariable)" ContinueOnError="true" />
  </Target>
Jhonny D. Cano -Leftware-
fuente
Esta es la mejor solución, ya que puede utilizar comodines para copiar muchos archivos y no es necesario que estén en el proyecto.
Chris Bordeman
37

También puede colocar los archivos o enlaces en la raíz del explorador de soluciones y luego establecer las propiedades de los archivos:

Build action = Content

y

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

Para obtener un enlace, arrastre el archivo desde el explorador de Windows al explorador de soluciones manteniendo presionadas las teclas Mayús y Control.

ingrese la descripción de la imagen aquí

Georg
fuente
3
Esto preservará la ruta relativa original, que no es aceptable para el OP
jlee
Si coloca el archivo en el nodo de nivel superior de su proyecto, se copiará directamente en la carpeta de salida $ (OutputPath).
Georg
4

Personalmente prefiero esta forma.

Modificar .csprojpara agregar

<ItemGroup>
    <ContentWithTargetPath Include="ConfigFiles\MyFirstConfigFile.txt">
      <CopyToOutputDirectory>PreserveNewest</CopyToOutputDirectory>
      <TargetPath>%(Filename)%(Extension)</TargetPath>
    </ContentWithTargetPath>
</ItemGroup>
Jérôme MEVEL
fuente
1
En mi opinión, es mucho mejor que un evento de evento posterior a la construcción. ¡Gracias!
khlr
¿No es esto lo mismo que hacer clic con el botón derecho en el proyecto y seleccionar "Agregar | Elemento existente" en el Explorador de soluciones, luego configurar la propiedad Archivo "Copiar al directorio de salida" en "Copiar si es más reciente"? No es necesario modificar el XML directamente.
Antony Booth
@AntonyBooth, después de un tiempo, se dará cuenta de que siempre es más fácil comprender lo que está sucediendo y modificar el código directamente en lugar de aprender a hacer lo mismo con su IDE. Hoy está usando Visual Studio, mañana podría ser JetBrains Rider y pasado mañana VS Code. Al final, siempre es mejor dominar un idioma que un IDE. PD: No sé si lo que describes es lo mismo ya que solo sé hacerlo en XML, mucho mejor así.
Jérôme MEVEL
3

copiar de subcarpeta a subcarpeta

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

 copy "$(ProjectDir)subfolder\"  "$(ProjectDir)$(OutDir)subfolder\"
Ehsäɳ Khʌɳ
fuente
7
Bienvenido a StackOverflow y gracias por contribuir. Ha respondido una pregunta muy antigua que ya tiene un montón de respuestas altamente votadas. Si cree que es útil tener su respuesta además de las respuestas con voto positivo existentes, debe agregar una pequeña explicación de por qué su respuesta resuelve el problema y por qué es mejor / diferente de las demás.
Matthijs Wessels
1

Desea utilizar un evento posterior a la compilación en su proyecto. Puede especificar la salida allí y hay valores de macro para cosas de uso frecuente como la ruta del proyecto, el nombre del elemento, etc.

Mark Sherretta
fuente
0

Puede utilizar el evento PostBuild del proyecto. Una vez completada la compilación, puede ejecutar un archivo por lotes de DOS y copiar los archivos deseados en la carpeta deseada.

Kirtan
fuente
0

Encontré esta pregunta buscando "copiar archivos en la carpeta de la aplicación en tiempo de compilación". OP parece tener esto resuelto ya, pero si no lo hace:

En Visual Studio, haga clic con el botón derecho en el archivo, seleccione propiedades y luego cambie la opción 'copiar en salida' a 'siempre'. Ver http://msdn.microsoft.com/en-us/library/0c6xyb66.aspx

Coronel Panic
fuente
5
OP solicita copiar al directorio de compilación sin mantener la estructura de directorio relativa de la ubicación del archivo copiado
Áxel Costas Pena