/// <summary> /// Copies the directory to the specified parent directory /// </summary> /// <param name="directory">Directory to copy to</param> /// <param name="options">Copy options</param> /// <returns></returns> public async Task <IDirectory> CopyToAsync(IDirectory directory, CopyOptions options = CopyOptions.CopyAlways) { if (InternalDirectory is null || directory is null || string.IsNullOrEmpty(directory.FullName)) { return(this); } directory.Create(); List <Task> Tasks = new List <Task>(); foreach (var TempFile in EnumerateFiles()) { switch (options) { case CopyOptions.CopyAlways: Tasks.Add(TempFile.CopyToAsync(directory, true)); break; case CopyOptions.CopyIfNewer: if (new FileInfo(directory.FullName + "\\" + TempFile.Name.Replace("/", "").Replace("\\", ""), Credentials).Exists) { var FileInfo = new FileInfo(directory.FullName + "\\" + TempFile.Name.Replace("/", "").Replace("\\", ""), Credentials); if (FileInfo.Modified.CompareTo(TempFile.Modified) < 0) { Tasks.Add(TempFile.CopyToAsync(directory, true)); } } else { Tasks.Add(TempFile.CopyToAsync(directory, true)); } break; case CopyOptions.DoNotOverwrite: Tasks.Add(TempFile.CopyToAsync(directory, true)); break; } } await Task.WhenAll(Tasks).ConfigureAwait(false); Tasks.Clear(); foreach (var SubDirectory in EnumerateDirectories()) { Tasks.Add(SubDirectory.CopyToAsync(new DirectoryInfo(directory.FullName + "\\" + SubDirectory.Name.Replace("/", "").Replace("\\", ""), Credentials), options)); } await Task.WhenAll(Tasks).ConfigureAwait(false); return(directory); }