How to recursively copy files using the <Copy> Task in MSBuild


From the MSBuild Team Blog

Have you ever run into a situation where you had to recursively copy files from one folder into another as a part of your build process?  We certainly have run into it a few times, and I thought I’d share with you a neat trick that involves the use of metadata and the Copy task.

Before you can copy a set of files, you need to be able to recursively add those files to an item list. Here’s how you do that when declaring items.

<ItemGroup>
      <Compile Include=".\**\*.cs" /> 
</ItemGroup>

The ** wildcard is used in item includes to indicate recursive includes.

So, once you have an item declared as such, you can rely on a piece of standard meta-data that goes with all items (i.e. RecursiveDir) to accomplish your recursive copy. The RecursiveDir metadata when used will return the evaluated value of the ** metadata for each item – and you can use that value to preserve the folder structure for each file when performing the copy. Here’s how you invoke the <Copy> task using this piece of metadata to copy recursively.

<Copy SourceFiles="@(Compile)" DestinationFolder="c:\foocopy\%(RecursiveDir)"></Copy>

Additional information can be found at the MSBuild Team Blog and the MSBuild Wiki.

Happy Visual Studio’ing!  Suggest a Tip of the Week!

Comments (1)

  1. Repeating a task for each item in a MSBuild item list is really easy if the task supports ; seperated lists, if not, well it’s still easy but trying to remember the syntax is another matter! This keeps catching me out and I’ve seen few examples of it

Skip to main content