public async Task DownloadToAsync(IDirectoryAccessor destinationRootDirectory, System.Threading.CancellationToken cancellation) { if (destinationRootDirectory.Access != IOAccess.FULL) { throw new NotSupportedException("Access denied"); } foreach (var fileTask in EnumerateFilesAsync()) { var file = await fileTask; var destinationFile = await destinationRootDirectory.GetFileAsync(new UPath(PATH_FORMAT, file.Name), cancellation); using (var destinationFileStream = await destinationFile.OpenAsync(FileOpenMode.NEW, cancellation)) using (var fileStream = await file.OpenAsync(FileOpenMode.OPEN_OR_NEW, cancellation)) { await fileStream.WriteToAsync(destinationFileStream, cancellation); } } foreach (var innerDir in EnumerateDirectoriesAsync(cancellation)) { var dir = await innerDir; var destinationDirectoryPath = new UPath(PATH_FORMAT, dir._rawData.path.RemoveFirst(_rawData.path)); var destinationDirectory = await destinationRootDirectory.GetDirectoryAsync(destinationDirectoryPath, cancellation); await destinationDirectory.EnsureCreatedAsync(cancellation); await dir.DownloadToAsync(destinationDirectory, cancellation); } }