Копирование файлов в папку приложения во время компиляции


96

Если у меня есть файлы, которые я хочу скопировать из моего проекта в .\bin\debug\папку при компиляции, то мне кажется, что мне нужно поместить их в корень проекта. Помещение их во вложенную папку, кажется, копирует их в .\bin\debug\папку в той же структуре, в которой они хранятся.

Есть ли способ избежать этого?

Чтобы быть ясным: если у меня есть MyFirstConfigFile.txtи MySecondConfigFile.txtв ConfigFilesпапке, и я установил для них Копировать на Выход как Копировать ... , то они появятся в .\bin\debug\ConfigFiles\папке. Я хочу, чтобы они появились в .\bin\debug\папке.

Ответы:


94

Вы можете сделать это с помощью события пост-сборки. Установите для файлов бездействие при компиляции, а затем в макросе скопируйте файлы в нужный каталог.

Вот макрос для пост-сборки, который, я думаю, будет работать, скопировав все файлы из каталога Configuration в корневую папку сборки:

copy $(ProjectDir)Configuration\* $(ProjectDir)$(OutDir)

1
В качестве пункта назначения не должно быть $ (ProjectDir) \% (OutDir)?
Эд Гривз

11
Правильный и проверенный (Vs2010) макрос: copy "$ (ProjectDir) Firebird \ firebird_bin *" "$ (ProjectDir) $ (OutDir)"
Эрик Боле-Фейсот,

Вы также можете просто создать относительный файл для вывода: скопируйте "$ (ProjectDir) Firebird \ firebird_bin *" "$ (OutDir)"
Элендурвен,

3
Я считаю, что использование кавычек необходимо:copy "$(ProjectDir)subfolder_name\"* "$(ProjectDir)$(OutDir)"
tedebus 01

1
В MSVS2017 (15.4) это должно быть просто $(OutDir)(т.е. без $(ProjectDir)) кажется ... иначе вы получите ошибки двойного пути
JHBonarius

51

Вы можете использовать задачу MSBuild в своем csproj, например.

Отредактируйте ваш файл csproj

  <Target Name="AfterBuild">
    <Copy SourceFiles="$(OutputPath)yourfiles" DestinationFolder="$(YourVariable)" ContinueOnError="true" />
  </Target>

Это лучшее решение, так как вы можете использовать подстановочные знаки для копирования большого количества файлов, и они не обязательно должны быть в проекте.
Крис Бордеман,

38

Вы также можете поместить файлы или ссылки в корень обозревателя решений, а затем установить свойства файлов:

Build action = Content

а также

Copy to Output Directory = Copy if newer (например)

Для ссылки перетащите файл из проводника Windows в проводник решений, удерживая нажатыми клавиши Shift и Control.

введите описание изображения здесь


3
Это сохранит исходный относительный путь, который неприемлем для OP
jlee

Если вы поместите файл в узел верхнего уровня вашего проекта, он будет скопирован прямо в выходную папку $ (OutputPath).
Георг

1
См. Этот пост для получения приемлемой альтернативы
Зои Хьюлл

5

Лично я предпочитаю этот способ.

Измените, .csprojчтобы добавить

<ItemGroup>
    <ContentWithTargetPath Include="ConfigFiles\MyFirstConfigFile.txt">
      <CopyToOutputDirectory>PreserveNewest</CopyToOutputDirectory>
      <TargetPath>%(Filename)%(Extension)</TargetPath>
    </ContentWithTargetPath>
</ItemGroup>

1
На мой взгляд, это лучше, чем событие после сборки. Спасибо!
khlr

Разве это не то же самое, что щелкнуть проект правой кнопкой мыши и выбрать «Добавить | Существующий элемент» в обозревателе решений, а затем установить для свойства файла «Копировать в выходной каталог» значение «Копировать, если новее». Нет необходимости напрямую изменять XML.
Энтони Бут,

1
@AntonyBooth через некоторое время вы поймете, что всегда легче понять, что происходит, и изменить код напрямую, чем научиться делать то же самое со своей IDE. Сегодня вы используете Visual Studio, завтра это может быть JetBrains Rider, а послезавтра VS Code. В конце концов, вы всегда лучше овладеваете языком, чем IDE. PS: Я не знаю, является ли то, что вы описываете, таким же, поскольку я знаю только, как это сделать в XML, намного лучше, чем это.
Жером МЕВЕЛ,

Кроме того, в настоящее время нет возможности установить целевой путь в среде IDE, поэтому сейчас нам нужно отредактировать XML.
Зои Хьюлл,

3

копировать из подпапки в подпапку

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

 copy "$(ProjectDir)subfolder\"  "$(ProjectDir)$(OutDir)subfolder\"

7
Добро пожаловать в StackOverflow и благодарим за участие. Вы ответили на действительно старый вопрос, на который уже есть много положительных ответов. Если вы считаете, что ваш ответ полезно иметь в дополнение к существующим ответам, за которые проголосовали, вы должны добавить небольшое объяснение того, почему ваш ответ решает проблему и почему он лучше / отличается от других.
Matthijs Wessels

1

Вы хотите использовать событие Post-Build в своем проекте. Вы можете указать вывод там, и есть значения макросов для часто используемых вещей, таких как путь к проекту, имя элемента и т. Д.


0

Вы можете использовать событие PostBuild проекта. После завершения сборки вы можете запустить командный файл DOS и скопировать нужные файлы в нужную папку.


0

Я нашел этот вопрос в поисках «копировать файлы в папку приложения во время компиляции». OP, похоже, уже отсортировал это, но если вы этого не сделаете:

В Visual Studio щелкните файл правой кнопкой мыши, выберите свойства, затем измените параметр «копировать для вывода» на «всегда». См. Http://msdn.microsoft.com/en-us/library/0c6xyb66.aspx


5
OP запрашивает копирование в каталог для компиляции без сохранения относительной структуры каталогов расположения скопированного файла
Аксель Костас Пена
Используя наш сайт, вы подтверждаете, что прочитали и поняли нашу Политику в отношении файлов cookie и Политику конфиденциальности.
Licensed under cc by-sa 3.0 with attribution required.