将整个目录复制到输出文件夹,维护文件夹结构?

Posted

技术标签:

【中文标题】将整个目录复制到输出文件夹,维护文件夹结构?【英文标题】:Copy entire directory to output folder maintaining the folder structure? 【发布时间】:2013-07-18 12:49:15 【问题描述】:

我希望在每次构建时将特定目录复制到输出文件夹(“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 > ...

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

【问题讨论】:

【参考方案1】:

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

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

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

【讨论】:

这确实有效。 A/ 很遗憾,这在 VS 解决方案资源管理器中是不可能的,而是“破解”了 csporj 文件。 B/ 当你有大量的测试数据时,它不仅会减慢构建速度,还会浪费整个磁盘空间负载 这对我有用,我只需要更改 xml 上的构建操作。构建操作是 ItemGroup 本身的元素。所以我将“内容”更改为“无”。这使得 Include 属性上的所有项目都具有构建操作“无” 为我工作,但为什么在 VS 2019 上它会在解决方案资源管理器中显示每个文件两次?好像对我没有影响。我是否必须删除每个子文件夹包含一行的另一个 ItemGroup 以及 VS 自动在 csproj 文件中创建的所有文件? 已经使用了这个解决方案和 XCOPY,这是更好的加载。 很棒的提示。并同意 - 为什么 MS 不将其作为简单的解决方案资源管理器功能包含在内?【参考方案2】:

这对我有用。 /S 是递归复制所有内容的密钥。

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

因为我希望每次都在没有提示的情况下覆盖文件,所以我还添加了一个 /Y 开关。

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

【讨论】:

/S 将忽略空文件夹。要复制所有内容,包括空文件夹,请改用 /E。 有没有办法在不使用命令行的情况下做到这一点。我知道您可以右键单击每个单独的文件并在属性中说“复制到输出目录”。但这相当麻烦,但透明且不易出错(由于拼写错误)。 @Shiroy 您可以尝试在 csproj 文件中批量编辑以设置“复制到输出目录”【参考方案3】:

尝试 XCOPY 而不是 COPY;例如

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

在此处了解有关 XCOPY 的更多信息...

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

【讨论】:

+1 给了我正确的方向。但我没有让你的解决方案奏效。我需要在第二个参数中指定目标目的地Template。而且我不确定是否真的需要/I。我没有编辑您的,而是将其作为单独的答案。 请注意,您可以使用 XCOPY "$(SolutionDir)..\Resources\Template" "$(TargetDir)" /S /I /Y 转到 SolutionDir 上方的一个目录【参考方案4】:

这是截至本文发布之日在 Visual Studio 2019 上运行的附加解决方案。这将递归地复制文件夹结构和其中的所有文件。在多项目解决方案中的 C++ .vcxproj 上进行了测试。


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

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

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

【讨论】:

【参考方案5】:

我有这个问题的有效解决方案:

<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>

【讨论】:

【参考方案6】:

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


    <Content Include="assets\**">
        <Link>assets\%(RecursiveDir)\%(Filename)%(Extension)</Link>
        <TargetPath>assets\%(RecursiveDir)\%(Filename)%(Extension)</TargetPath>
        <CopyToOutputDirectory>PreserveNewest</CopyToOutputDirectory>
    </Content>

注意:此解决方案需要 Visual Studio 16.10 或更高版本。

【讨论】:

以上是关于将整个目录复制到输出文件夹,维护文件夹结构?的主要内容,如果未能解决你的问题,请参考以下文章

将目录复制到输出目录 - 控制台应用程序 .NET

使用 Grunt.js 将所有文件从目录复制到另一个目录

使用 Grunt.js 将所有文件从目录复制到另一个目录

复制具有特定父目录的所有文件,同时维护目录树

发布构建脚本以将所有文件从不同的目录复制到输出目录

将整个目录从容器复制到主机