将整个目录复制到输出文件夹以保持文件夹结构?

问题描述 投票:0回答:9

我希望在每次构建时将特定目录复制到输出文件夹(“bin”)。我认为它可以通过构建后脚本来处理。但我不确定如何复制目录本身。我知道如何处理特定文件。

例如,这适用于文件:

项目 > 属性 > 构建事件 > 构建后

COPY "$(SolutionDir)Resources\Release Notes.pdf" "$(TargetDir)"

但是假设我有一个目录

Template
,现在我需要
Template
下的所有内容在成功构建后
bin
文件夹中维护文件夹结构

我试过这个:

COPY "$(SolutionDir)Resources\Template\" "$(TargetDir)"

仅以这种方式复制

Template
目录中的文件,而不是子目录和
Template
文件夹中的文件。我希望文件夹
Template
本身位于我的输出
bin
文件夹中。换句话说,
bin
应该看起来像:

bin > Template > abc.xxx  
                 xxx.yyy
                 Subdirectory1 > asd.qwe
                                 zxc.qwe 
                 Subdirectory2 > ...

这可能是重复的,但我找不到相关的线程。谢谢。

visual-studio visual-studio-2012 directory copy xcopy
9个回答
114
投票

我刚刚将其添加到我的 *.csproj 文件中(右键单击“编辑项目文件”)

<ItemGroup>
    <Content Include="MYCUSTOMFOLDER\**">
        <CopyToOutputDirectory>PreserveNewest</CopyToOutputDirectory>
    </Content>
</ItemGroup>

我认为为此目录需要与 *.csproj 文件处于同一层次结构级别或低于该层次结构级别。


63
投票

这对我有用。

/S
是递归复制所有内容的键。

XCOPY "$(SolutionDir)Resources\Template" "$(TargetDir)\Template\" /S

由于我希望每次都在没有提示的情况下覆盖文件,因此我还添加了一个

/Y
开关。

XCOPY "$(SolutionDir)Resources\Template" "$(TargetDir)\Template\" /S /Y

22
投票

尝试 XCOPY 而不是 COPY;例如

XCOPY "$(SolutionDir)Resources\Template\" "$(TargetDir)\Template" /s /i /y

有关 XCOPY 的更多信息请点击此处...

http://www.computerhope.com/xcopyhlp.htm


12
投票

CodingYourLife的解决方案几乎对我有用,但我发现 PreserveNewest 没有受到尊重。我在 Visual Studio 论坛上找到了一个可以正常工作的解决方案。我的 .CSPROJ 现在看起来像这样:

<Content Include="assets\**"> <Link>assets\%(RecursiveDir)\%(Filename)%(Extension)</Link> <TargetPath>assets\%(RecursiveDir)\%(Filename)%(Extension)</TargetPath> <CopyToOutputDirectory>PreserveNewest</CopyToOutputDirectory> </Content>
注意:此解决方案需要 Visual Studio 16.10 或更高版本。


9
投票
截至本文发布之日,这是在 Visual Studio 2019 上运行的另一个解决方案。 这将递归复制文件夹结构及其中的所有文件。 在多项目解决方案中的 C++ .vcxproj 上进行了测试。


首先,首先编辑 [ .proj / .vcxproj / .csproj ] 文件。 打开后,找到您的项目范围标签。 如果您已经有 ItemGroups,请将下面的代码直接粘贴到现有的 ItemGroups 之后。 否则,请将其添加到 PropertyGroup 标记之前。 然后修改您要复制到输出路径的文件夹结构的包含和链接参数。

<ItemGroup> <Content Include="..\Assets\**\*.*"> <CopyToOutputDirectory>PreserveNewest</CopyToOutputDirectory> <DeploymentContent>true</DeploymentContent> <Link>Assets\%(RecursiveDir)\%(Filename)%(Extension)</Link> </Content> </ItemGroup>


注意:如果您有多个顶级文件夹,例如 JS、IMG、BIN 等,请为每个文件夹创建一个新条目。


5
投票
这个效果非常好!

<ItemGroup> <Content Include="DesignConfiguration\**"> <CopyToOutputDirectory>Always</CopyToOutputDirectory> </Content> </ItemGroup>


4
投票
我对这个问题有一个可行的解决方案:

<Target Name="PostBuild" AfterTargets="PostBuildEvent"> <ItemGroup> <CommonFont Include="..\common\src\Web\wwwroot\css\fonts\*.*" /> </ItemGroup> <Copy SourceFiles="@(CommonFont)" DestinationFolder="wwwroot\css\fonts" SkipUnchangedFiles="true" /> </Target>
    

1
投票
这是唯一对我有用的解决方案(VS2022,.Net Framework):

<ItemGroup> <ContentWithTargetPath Include="..\..\..\Libraries\Core\Business\Vodovoz.Reports\Reports\**"> <CopyToOutputDirectory>PreserveNewest</CopyToOutputDirectory> <TargetPath>Reports\%(RecursiveDir)\%(Filename)%(Extension)</TargetPath> </ContentWithTargetPath> </ItemGroup>
    

1
投票
最简单的解决方案是:

<ItemGroup> <StaticFiles Include="wwwroot/**/*.*"/> </ItemGroup> <Target Name="CopyCustomContentBuild" AfterTargets="Build"> <Copy SourceFiles="@(StaticFiles)" DestinationFolder="$(OutDir)/wwwroot/%(RecursiveDir)" SkipUnchangedFiles="true" /> </Target>
    
© www.soinside.com 2019 - 2024. All rights reserved.