当前位置: 首页 > news >正文

使用 MSBuild Target 复制文件的时候如何保持文件夹结构不变

使用 MSBuild 中的 Copy 这个编译目标可以在 .NET 项目编译期间复制一些文件。不过使用默认的参数复制的时候文件夹结构会丢失,所有的文件会保留在同一级文件夹下。

那么如何在复制文件的时候保持文件夹结构与原文件夹结构一样呢?


本文内容

    • Copy
    • RecursiveDir

Copy

下面是一个典型的使用 MSBuild 在编译期间复制文件的一个编译目标。

<Target Name="_WalterlvCopyDemo" AfterTargets="AfterBuild">
  <ItemGroup>
    <_WalterlvToCopyFile Include="$(OutputPath)**" />
  </ItemGroup>
  <Copy SourceFiles="@(_WalterlvToCopyFile)" DestinationFolder="bin\Debug\Test" SkipUnchangedFiles="True" />
</Target>

这样复制的文件是不会保留文件夹结构的。

在同一层级

复制之后,所有的文件夹将不存在,所有文件覆盖地到同一层级。

RecursiveDir

如果希望保留文件夹层级,可以在 DestinationFolder 中使用文件路径来替代文件夹路径。

  <Target Name="_WalterlvCopyDemo" AfterTargets="AfterBuild">
    <ItemGroup>
      <_WalterlvToCopyFile Include="$(OutputPath)**" />
    </ItemGroup>
-   <Copy SourceFiles="@(_WalterlvToCopyFile)" DestinationFolder="bin\Debug\Test" SkipUnchangedFiles="True" />
+   <Copy SourceFiles="@(_WalterlvToCopyFile)" DestinationFolder="bin\Debug\Test\%(RecursiveDir)" SkipUnchangedFiles="True" />
  </Target>

保留了文件夹层次结构


我的博客会首发于 https://blog.walterlv.com/,而 CSDN 会从其中精选发布,但是一旦发布了就很少更新。

如果在博客看到有任何不懂的内容,欢迎交流。我搭建了 dotnet 职业技术学院 欢迎大家加入。

知识共享许可协议

本作品采用知识共享署名-非商业性使用-相同方式共享 4.0 国际许可协议进行许可。欢迎转载、使用、重新发布,但务必保留文章署名吕毅(包含链接:https://walterlv.blog.csdn.net/),不得用于商业目的,基于本文修改后的作品务必以相同的许可发布。如有任何疑问,请与我联系。

相关文章:

  • 如何在 MSBuild 中正确使用 % 来引用每一个项(Item)中的元数据
  • 如何将一个 .NET 对象序列化为 HTTP GET 的请求字符串
  • 屏幕边缘上有趣的 1 个像素,看不见、摸不到
  • 在 MSBuild 编译过程中操作文件和文件夹(检查存在/创建文件夹/读写文件/移动文件/复制文件/删除文件夹)
  • 在 WPF 程序中应用 Windows 10 真•亚克力效果
  • 推荐 .NET/C# 开发者安装的几款代码分析插件或对应的代码分析 NuGet 包
  • 在 HTML 超链接上添加可交互的 ToolTip
  • 在移动端打开 Google 的网页快照
  • 为自己搭建的博客添加可切换的暗色和亮色主题
  • 如何编写基于 Microsoft.NET.Sdk 的跨平台的 MSBuild Target(附各种自带的 Task)
  • 让你编写的控件库在 XAML 中有一个统一的漂亮的命名空间(xmlns)和命名空间前缀
  • Sdk 风格的 csproj 对 WPF/UWP 支持不太好?有第三方 SDK 可以用!MSBuild.Sdk.Extras
  • 为博客或个人站点的 Markdown 添加 LaTeX 公式支持
  • 如何让 .NET Core 命令行程序接受密码的输入而不显示密码明文
  • 如何编写 WPF 的标记扩展 MarkupExtension,即便在 ControlTemplate/DataTemplate 中也能生效
  • 【vuex入门系列02】mutation接收单个参数和多个参数
  • 【干货分享】SpringCloud微服务架构分布式组件如何共享session对象
  • Angular数据绑定机制
  • Apache的80端口被占用以及访问时报错403
  • es6(二):字符串的扩展
  • Java Agent 学习笔记
  • Javascript基础之Array数组API
  • JS学习笔记——闭包
  • ng6--错误信息小结(持续更新)
  • pdf文件如何在线转换为jpg图片
  • Python利用正则抓取网页内容保存到本地
  • Redis 懒删除(lazy free)简史
  • Spark学习笔记之相关记录
  • vue数据传递--我有特殊的实现技巧
  • 电商搜索引擎的架构设计和性能优化
  • 服务器从安装到部署全过程(二)
  • 给自己的博客网站加上酷炫的初音未来音乐游戏?
  • 关于extract.autodesk.io的一些说明
  • 基于axios的vue插件,让http请求更简单
  • 紧急通知:《观止-微软》请在经管柜购买!
  • 浅谈JavaScript的面向对象和它的封装、继承、多态
  • 算法-图和图算法
  • 通信类
  • 小程序开发之路(一)
  • 正则表达式
  • 3月27日云栖精选夜读 | 从 “城市大脑”实践,瞭望未来城市源起 ...
  • ​flutter 代码混淆
  • (附源码)ssm学生管理系统 毕业设计 141543
  • (四) Graphivz 颜色选择
  • (转)AS3正则:元子符,元序列,标志,数量表达符
  • (转)总结使用Unity 3D优化游戏运行性能的经验
  • .form文件_一篇文章学会文件上传
  • .NET Conf 2023 回顾 – 庆祝社区、创新和 .NET 8 的发布
  • .net core webapi Startup 注入ConfigurePrimaryHttpMessageHandler
  • .NET 常见的偏门问题
  • .Net 路由处理厉害了
  • .NET上SQLite的连接
  • ??eclipse的安装配置问题!??
  • ??在JSP中,java和JavaScript如何交互?
  • @angular/cli项目构建--http(2)