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

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\"
Ehsäɳ Khʌɳ
источник
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 запрашивает копирование в каталог для компиляции без сохранения относительной структуры каталогов расположения скопированного файла
Аксель Костас Пена