47

当我构建一个 Visual Studio 项目时,可执行文件被写入项目属性页中指定的输出目录。

我有一个项目,其中有一些程序使用的额外文件(例如.ini文件)。

如何配置项目以将文件复制到输出目录,以便在程序运行时,它的 CWD 中有另一个文件的副本?

我检查了文件的属性页,除了从构建中排除它的选项(已禁用)之外没有其他用处,并且 custom-build-tool 命令为空(加上它是一个纯文本文件不需要任何处理)。

4

9 回答 9

43

要将文件复制到 Visual Studio 2003 中的输出目录,您可以使用 Post-Build 事件:

  1. 右键单击项目->属性
  2. 通用属性->构建事件
  3. 将构建后事件命令行设置为:

    xcopy /y $(ProjectDir)my_file.ini  $(ProjectDir)$(OutDir)
    
  4. 好的并建立!

于 2012-06-01T06:52:05.090 回答
34

请尝试在解决方案资源管理器中选择文件。然后您应该能够在“属性”窗口中看到它的属性(F4如果它不可见,请按)。你会发现有两个属性:

  • “建设行动”和
  • “复制到输出目录”

将“构建操作”设置为“内容”,然后 - 为“复制到输出目录”设置选择适当的值。

具有“构建操作”和“复制到输出目录”设置的文件属性窗口

文件属性窗口

如果上述方法不适合您,请阅读这篇文章“使用 .inf 文件复制到输出目录问题”。然后看看这个“ Visual Studio:非默认文件类型的默认构建操作

希望有帮助

于 2012-05-31T06:24:21.113 回答
6

当我在文件的属性页中搜索构建操作字段时,我有一个想法:设置自定义构建步骤以复制文件(手动)。事实证明这比我想象的要容易。我认为它需要使用cmd或其他外部可执行文件(xcopy,robocopy等),但这不是必需的。

我将自定义构建步骤设置如下:

Command Line : copy $(InputFileName) $(OutDir)
Description  : Copying foobar...
Outputs      : $(InputFileName)

设置输出字段(正确)对于防止 VS 始终认为项目已过时并需要重建(我不确定是否需要以 为前缀$(OutDir)\)至关重要。

它反映在“输出”窗口中,如下所示:

Copying foobar...
        1 file(s) copied.
Compiling resources...
Linking...
于 2012-05-31T07:01:13.327 回答
4

对于 VS 2017,Dmitry Pavlov 发布的命令如下:

xcopy /y "$(ProjectDir)my_file.ini"  "$(OutDir)"

如果项目目录的路径中有空格,引号很重要。

于 2018-04-26T10:41:19.927 回答
3

扩展 Synetech 的答案。

在 VS2019 中,在解决方案资源管理器中右键单击要复制的文件,然后选择属性。然后在 General >> Item Type 下更改为 Copy File,然后点击 Apply。
您现在应该在目的地等的属性页面中有 UI 字段。

于 2020-05-28T01:34:13.623 回答
2

如果这对任何人都有帮助,我需要将我正在构建的项目的输出 dll 复制到另一个项目中。

xcopy /y "$(ProjectDir)$(OutDir)$(TargetName)$(TargetExt)" 
"C:\Application\MyApplicationName\bin\x86\Debug"

/y = overwrite file if already exists
$(ProjectDir) = location on your machine where the project lives
$(OutDir) = is where your current build setup outputs the build
$(TargetName) = What the project being built is set to be called. Ex: XXX of XXX.dll
$(TargetExt) = the extension of the build Ex: .dll of XXX.dll

"C:/..../x86/Debug" is the location to copy to.
于 2018-06-29T19:54:03.667 回答
0

您需要额外的 $(OutDir)。否则,在重建/清理步骤中,它将丢弃您的源代码。

CommandLine : copy "$(SolutionDir)last-script.js" "$(TargetDir)Debug"

Outputs  : $(TargetDir)Debug\last-script.js
于 2014-12-19T11:22:59.900 回答
0

改进 Synetech 答案:

在 VS 2013 C++ 项目中 命令行:copy %(Identity) $(OutDir) 描述:Copying foobar... 输出:%(Identity) 有效,但是会导致循环依赖,即每次你要求增量时都会执行建立,没有米它已经被复制了。

要解决此问题,您可以将该项目添加到目标文件夹,将路径更改为 $(OutDir),然后在第一个添加的项目中将其用作输出。缺点 - 两个具有相似名称的项目在解决方案中。

在构建后使用 /d /y 参数的 xcopy 也很有用 - 仅当目标文件日期较旧时才复制。

于 2016-05-03T14:22:13.923 回答
0

您还可以在卸载项目后(右键单击项目>>卸载项目)在现有<ItemGroup>标签中添加以下内容:

<Content Include="..\..\Config\db.config">
  <Link>Config\db.config</Link>
  <CopyToOutputDirectory>Always</CopyToOutputDirectory>
  <SubType>Designer</SubType>
</Content>

在这种情况下,它会从 2 个文件夹中抓取 db.config 文件,并在创建一个包含 db.config 文件的 Config 文件夹后将其放入输出文件夹(默认为 bin/Debug)

于 2022-02-03T17:09:49.643 回答