private void FolderTransferRecursively(string inputFolder, string outputFolder) { if (!Directory.Exists(outputFolder)) { Directory.CreateDirectory(outputFolder); } var inputList = GetItems(inputFolder); Parallel.ForEach(inputList, new ParallelOptions { MaxDegreeOfParallelism = MaxParallel }, inputItemPath => { string inputItemName = inputItemPath.Split('\\').Last(); string outputItemName = ItemRename(inputItemName); string outputItemPath = Path.Combine(outputFolder, outputItemName); try { ItemTransfer(inputItemPath, outputItemPath); } catch (Exception e) { Logger.WriteLineWithLock(e.Message, true, true); } }); foreach (string inputSubFolder in Directory.EnumerateDirectories(inputFolder)) { string subFolderName = inputSubFolder.Split('\\').Last(); string outputSubFolderPath = Path.Combine(outputFolder, subFolderName); FolderTransferRecursively(inputSubFolder, outputSubFolderPath); } }