在编译时将文件复制到应用程序文件夹中


93

如果我有一些文件要从项目中复制到.\bin\debug\编译时的文件夹中,那么看来我必须将它们放入项目的根目录中。将它们放入子文件夹似乎会将它们复制到与.\bin\debug\存储它们的结构相同的文件夹中。

有什么办法可以避免这种情况?

只是要清楚一点:如果我在文件夹中有MyFirstConfigFile.txtand MySecondConfigFile.txtConfigFiles并且将它们的Copy to Output设置为Copy ...,那么它们将出现在.\bin\debug\ConfigFiles\文件夹中。我希望它们出现在.\bin\debug\文件夹中。

Answers:


90

您可以通过构建后事件来做到这一点。将文件设置为不执行编译操作,然后在宏中将文件复制到所需的目录。

这是一个构建后宏,我认为可以通过将名为Configuration的目录中的所有文件复制到根构建文件夹中来工作:

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

1
对于目的地,应该不是$(ProjectDir)\%(OutDir)吗?
Ed Greaves 2012年

11
正确和经过测试的(Vs2010)宏是:复制“ $(ProjectDir)Firebird \ firebird_bin *”“ $(ProjectDir)$(OutDir)”
Eric Bole-Feysot

您也可以只做一个相对文件输出:复制“ $(ProjectDir)Firebird \ firebird_bin *”“ $(OutDir)”
Elendurwen

3
我认为必须使用引号:copy "$(ProjectDir)subfolder_name\"* "$(ProjectDir)$(OutDir)"
tedebus '17

1
在MSVS2017(15.4)中,它应该只是$(OutDir)(即不带$(ProjectDir))似乎……否则您会遇到双路径错误
JHBonarius18年

51

您可以像这样在csproj上使用MSBuild任务。

编辑您的csproj文件

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

这是最好的解决方案,因为您可以使用通配符来复制许多文件,并且它们不必在项目中。
克里斯·博德曼

37

您还可以将文件或链接放入解决方案资源管理器的根目录,然后设置文件属性:

Build action = Content

Copy to Output Directory = Copy if newer (例如)

对于链接,请按住Shift键和控制键,将文件从Windows资源管理器拖动到解决方案资源管理器中。

在此处输入图片说明


3
这将保留原始的相对路径,这是OP所不能接受的
jlee 2014年

如果将文件放入项目的顶级节点,则它将直接复制到输出文件夹$(OutputPath)中。
乔治2014年

3

从子文件夹复制到子文件夹

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

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

7
欢迎使用StackOverflow,并感谢您的贡献。您已经回答了一个非常老的问题,该问题已经有了很多高度支持的答案。如果您认为您的答案除了现有的已推荐答案之外还有其他用途,您应该添加一些解释,说明您的答案为什么可以解决问题以及为什么它比其他答案更好/不同。
Matthijs Wessels,

3

我个人更喜欢这种方式。

修改.csproj以添加

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

1
在我看来,这比构建后的事件要好。谢谢!
khlr

这与右键单击项目,然后从解决方案资源管理器中选择“添加|现有项”,然后将“复制到输出目录”的“文件”属性设置为“如果更新则复制”是不一样的。无需直接修改XML。
安东尼·布斯

一段时间之后,@ AntonyBooth会意识到,了解正在发生的事情并直接修改代码总是比学习如何使用IDE做相同的事情总是容易的。今天您正在使用Visual Studio,明天可能是JetBrains Rider,第二天可能就是VS Code。最后,总能更好地掌握语言而不是IDE。PS:我不知道您描述的内容是否相同,因为我只知道如何用XML进行操作,这样更好。
杰罗姆MEVEL

1

您要在项目上使用Post-Build事件。您可以在此处指定输出,并为经常使用的项目提供宏值,例如项目路径,项目名称等。


0

您可以使用项目的PostBuild事件。构建完成后,您可以运行DOS批处理文件并将所需文件复制到所需文件夹中。


By using our site, you acknowledge that you have read and understand our Cookie Policy and Privacy Policy.
Licensed under cc by-sa 3.0 with attribution required.