复制到输出目录复制文件夹结构,但只想复制文件

我有一个VS2008我想从一个目录复制某些文件到我的/bin/文件夹。 我已经将文件(位于/common/browserhawk/ )设置为“复制到输出目录”。 但是,它也会复制文件夹结构:将文件复制到/bin/common/browserhawk/

我如何获得这些文件复制到/bin/ ? 我不想将这些存储在网站的根目录,以使其正确复制。

相关问题: Visual Studio在编译后将.dll和.pdb添加到项目中

您可以添加一个后期制作事件来复制这些文件。
转到项目属性,生成事件选项卡,并将以下内容添加到生成后事件命令行中:

 copy "$(ProjectDir)\common\browserhawk\*.*" "$(TargetDir)" 

如果项目path中有空格,请务必包含引号。

既然我不能评论以前的答案,我会把解决scheme放在这里:

添加@PaulAlexander提供的内容,将以下内容添加到.csproj / .vbproj文件中:

 <ItemGroup> <AvailableItemName Include="RootContent"> <Visible>false</Visible> </AvailableItemName> </ItemGroup> <Target Name="AfterBuild"> <Copy DestinationFolder="$(OutputPath)" SourceFiles="@(RootContent)" SkipUnchangedFiles="true" /> </Target> 

这使您可以在“属性”窗口中select“RootContent”作为“构build操作”,所有操作都可以通过GUI进行访问。 一个更完整的解释:“AvailableItemName”选项基本上创build一个新的命名列表,您可以在项目中将属性窗口中“生成操作”属性下的项目。 然后你可以在你喜欢的任何目标中使用这个新创build的列表(例如通过“@(RootContent)”)。

如果在文本编辑器中编辑.csproj / .vbproj,则可以控制将文件放置在输出目录中的位置,以及文件在输出目录中的名称。 例如:

 <None Include="content\someContent.txt"> <Link>someContentInOutputDirectory.txt</Link> <CopyToOutputDirectory>PreserveNewest</CopyToOutputDirectory> </None> 

这将把文件content\someContent.txt放入bin\someContentInOutputDirectory.txt 。 如果你愿意,你也可以在binselect一个子目录。 只需将其添加到链接元素。

我相信XCOPY命令更好地处理目录和文件。 因此,

  XCOPY "$(ProjectDir)common/browserhawk" "$(TargetDir)" /E /I /F /Y 

这允许从目标目录创build文件夹。

  XCOPY "$(ProjectDir)Templates" "$(TargetDir)" /E /I /F /Y 

项目文件夹/文件结构:

  A:\TEMP\CONSOLEAPPLICATION3\TEMPLATES ├───NewFolder1 ├───NewFolder2 │ TextFile1.txt │ TextFile2.txt └───NewFolder3 TextFile1.txt TextFile2.txt TextFile3.txt 

变为:

  A:\TEMP\CONSOLEAPPLICATION3\BIN\DEBUG │ ConsoleApplication3.exe │ ConsoleApplication3.pdb │ ConsoleApplication3.vshost.exe │ ConsoleApplication3.vshost.exe.manifest ├───NewFolder1 ├───NewFolder2 │ TextFile1.txt │ TextFile2.txt │ └───NewFolder3 TextFile1.txt TextFile2.txt TextFile3.txt 

将以下内容添加到.csproj / .vbproj文件中

 <Target Name="AfterBuild"> <Copy DestinationFolder="$(OutputPath)" SourceFiles="@(RootContent)" SkipUnchangedFiles="true" /> </Target> 

然后,将根文件夹中所需文件的Build Action更改为RootContent。

我已经在VS2010和VS2015中使用了这个。 我喜欢这个解决scheme,因为

  1. XML可以在任何项目中重用
  2. 在“Visual Studio UI”中,“RootContent”被选为“构build操作”,就像任何其他“内容”
  3. “CopyToOutputDirectory”服从,就像你所期望的一样
  4. RootContent被添加到项目的输出中:通过Project-References进行,遵循“Clean”等。
  5. RootContent可以用通配符指定,保留recursion的文件夹结构:
     <RootContent Include="common\browserhawk\**"> <CopyToOutputDirectory>Always</CopyToOutputDirectory> </RootContent> 

往项目文件的开始处:

  <ItemGroup> <AvailableItemName Include="RootContent"> <!-- Add "RootContent" as a choice in the "Build Action" dropdown. --> <Visible>False</Visible> </AvailableItemName> </ItemGroup> 

从这个答案借用

在Microsoft .targets导入之后:

  <PropertyGroup> <AssignTargetPathsDependsOn> $(AssignTargetPathsDependsOn); IncludeRootContentAsContent; </AssignTargetPathsDependsOn> </PropertyGroup> <Target Name="IncludeRootContentAsContent"> <CreateItem Include="@(RootContent)" AdditionalMetadata="TargetPath=%(RecursiveDir)%(Filename)%(Extension)"> <Output ItemName="ContentWithTargetPath" TaskParameter="Include" /> </CreateItem> </Target> 

从这个答案借用

我最终添加了一个步骤到nant构build文件复制成功compliation后复制

 <target name="action.copy.browserhawk.config" depends="compile.source"> <copy todir="${App.Web.dir}/bin/" includeemptydirs="false"> <fileset basedir="${browserhawk.config.dir}"> <include name="bhawk_bb.dat" /> <include name="bhawk_sp.dat" /> <include name="browserhawk.properties" /> <include name="maindefs.bdd" /> <include name="maindefs.bdf" /> <include name="BH_PRO.lic" /> </fileset> </copy> <echo message="COPY BROWSERHAWK CONFIG: SUCCESS ${datetime::now()}" /> </target> 

您可以构build一个batch file来复制这些文件并将其作为生成后事件执行。