我有一个VS2008,我想从一个目录中复制某些文件到我的/bin/
文件夹。我已将这些文件(位于/common/browserhawk/
中)设置为“复制到输出目录”。但是,它会同时复制文件夹结构:文件被复制到/bin/common/browserhawk/
。
如何让这些文件只复制到/bin/
?我不想将它们存储在网站的根目录中,以使其正确复制。
我有一个VS2008,我想从一个目录中复制某些文件到我的/bin/
文件夹。我已将这些文件(位于/common/browserhawk/
中)设置为“复制到输出目录”。但是,它会同时复制文件夹结构:文件被复制到/bin/common/browserhawk/
。
如何让这些文件只复制到/bin/
?我不想将它们存储在网站的根目录中,以使其正确复制。
你可以添加一个“Post Build Event”来复制文件。
进入项目属性,选择“生成事件”选项卡,然后在“后期生成事件命令行”中添加以下内容:
copy "$(ProjectDir)\common\browserhawk\*.*" "$(TargetDir)"
如果您的项目路径中有空格,请确保包含引号。
由于我不能在之前的答案中进行评论,因此我将在这里提供解决方案:
在你的 .csproj/.vbproj 文件中加入以下内容,以补充 @PaulAlexander 的回答:
<ItemGroup>
<AvailableItemName Include="RootContent">
<Visible>false</Visible>
</AvailableItemName>
</ItemGroup>
<Target Name="AfterBuild">
<Copy
DestinationFolder="$(OutputPath)"
SourceFiles="@(RootContent)"
SkipUnchangedFiles="true"
/>
</Target>
这使您可以在属性窗口中将"RootContent"选择为构建操作,并且所有内容都可以通过GUI访问。 更详细的解释: "AvailableItemName"选项基本上创建了一个新的命名列表,您可以在属性窗口下的"Build Action"属性中将项目项分配给该列表。然后,您可以在任何目标中使用此新创建的列表(例如通过"@(RootContent)")。
<Target Name="RootOutputCopyTarget" AfterTargets="Build">
... </Target> - lorond如果您在文本编辑器中编辑 .csproj / .vbproj 文件,您可以控制文件在输出目录中的位置,以及文件在输出目录中的名称。例如:
<None Include="content\someContent.txt">
<Link>someContentInOutputDirectory.txt</Link>
<CopyToOutputDirectory>PreserveNewest</CopyToOutputDirectory>
</None>
这将把文件content\someContent.txt
放入bin\someContentInOutputDirectory.txt
中。如果您想要选择bin
中的子目录,则可以在链接元素中添加它。
我认为XCOPY命令更好地处理目录和文件。因此,
XCOPY "$(ProjectDir)common/browserhawk" "$(TargetDir)" /E /I /F /Y
这允许在目标目录下创建文件夹。
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
/D
可能也很有用,以避免覆盖可能的更改。 - KurzedMetal<Target Name="AfterBuild">
<Copy
DestinationFolder="$(OutputPath)"
SourceFiles="@(RootContent)"
SkipUnchangedFiles="true"
/>
</Target>
然后将任何想要在根目录下的文件的构建操作(Build Action)更改为RootContent。
FileWrites
。否则,Clean不会真正清理那些文件。请参阅CopyFilesToOutputDirectory
内置目标。 - Daniel Yankowsky我在VS2010、VS2015、VS2017、VS2019和VS2022中使用过这个解决方案。我喜欢这个解决方案,因为:
<RootContent Include="common\browserhawk\**">
<CopyToOutputDirectory>Always</CopyToOutputDirectory>
</RootContent>
项目文件开头处:
<ItemGroup>
<AvailableItemName Include="RootContent">
<!-- Add "RootContent" as a choice in the "Build Action" dropdown. -->
<Visible>True</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>
RootContent
替换为CustomContent
,以指示这是我们添加到此项目中的专业内容,并且我们需要以特定方式复制。
另外,我需要使用TargetPath=%(RecursiveDir)%(Filename)%(Extension)
来重新创建从指定的“CustomContent”文件到输出路径的文件夹结构。 - Jonno/common/browserhawk/
下的文件复制到/bin/common/browserhawk/
下呢?
如果我没记错的话,我的意图是让/common/browserhawk/a.txt
最终出现在/bin/a.txt
中,但允许从那里向下递归,所以/common/browserhawk/secret/stuff.png
最终出现在/bin/secret/stuff.png
中。 - Jonno%(RecursiveDirectory)
。这真的很酷,因为除了在IDE中选择单个文件外,还可以使用通配符指定多个文件。当使用**
通配符时,整个文件夹结构将被保留。 - MattGerg<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>
xcopy /s /d /y "$(ProjectDir)\stuff" "$(TargetDir)\stuff"
- Danny Staple