protected static async Task CopyFilesAsync(IFileOperationsExecuter fileOps, string sourceDirectory, string targetDirectory, bool keepInternals = false) { if (!await fileOps.DirectoryExistsAsync(sourceDirectory).ConfigureAwait(false)) { return; } char separator = fileOps.DirectorySeparator; var infos = await fileOps.GetFileSystemInfosAsync(sourceDirectory, keepInternals?MaskingContext.IncludeAll : new MaskingContext(new[] { "**" }, new[] { "**" + separator + ".git**", ".git**" })).ConfigureAwait(false); var directoriesToCreate = infos.OfType <SlimDirectoryInfo>().Select(d => CombinePaths(targetDirectory, d.FullName.Substring(sourceDirectory.Length), separator)).ToArray(); var relativeFileNames = infos.OfType <SlimFileInfo>().Select(f => f.FullName.Substring(sourceDirectory.Length).TrimStart(separator)).ToArray(); await fileOps.CreateDirectoryAsync(targetDirectory).ConfigureAwait(false); foreach (string folder in directoriesToCreate) { await fileOps.CreateDirectoryAsync(folder).ConfigureAwait(false); } await fileOps.FileCopyBatchAsync( sourceDirectory, relativeFileNames, targetDirectory, relativeFileNames, true, true ).ConfigureAwait(false); }