void Command_Files_Operations_CopyMove(CopyMoveFilesDialog.Result result, bool move) { var variables = GetVariables(); var oldFileNameExpression = new NEExpression(result.OldFileName); var newFileNameExpression = new NEExpression(result.NewFileName); var resultCount = variables.ResultCount(oldFileNameExpression, newFileNameExpression); var oldFileNames = oldFileNameExpression.EvaluateRows<string>(variables, resultCount); var newFileNames = newFileNameExpression.EvaluateRows<string>(variables, resultCount); const int InvalidCount = 10; var invalid = oldFileNames.Distinct().Where(name => !FileOrDirectoryExists(name)).Take(InvalidCount).ToList(); if (invalid.Any()) throw new Exception($"Sources don't exist:\n{string.Join("\n", invalid)}"); invalid = newFileNames.Select(name => Path.GetDirectoryName(name)).Distinct().Where(dir => !Directory.Exists(dir)).Take(InvalidCount).ToList(); if (invalid.Any()) throw new Exception($"Directories don't exist:\n{string.Join("\n", invalid)}"); // If user specified a file and a directory, assume they want the file (with the same name) in that directory newFileNames = newFileNames.Zip(oldFileNames, (newFileName, oldFileName) => (File.Exists(oldFileName)) && (Directory.Exists(newFileName)) ? Path.Combine(newFileName, Path.GetFileName(oldFileName)) : newFileName).ToList(); invalid = oldFileNames.Zip(newFileNames, (oldFileName, newFileName) => new { oldFileName, newFileName }).Where(obj => (Directory.Exists(obj.newFileName)) || ((Directory.Exists(obj.oldFileName)) && (File.Exists(obj.newFileName)))).Select(pair => pair.newFileName).Distinct().Take(InvalidCount).ToList(); if (invalid.Any()) throw new Exception($"Destinations already exist:\n{string.Join("\n", invalid)}"); if (new Message(WindowParent) { Title = "Confirm", Text = $"Are you sure you want to {(move ? "move" : "copy")} these {resultCount} files/directories?", Options = Message.OptionsEnum.YesNo, DefaultAccept = Message.OptionsEnum.Yes, DefaultCancel = Message.OptionsEnum.No, }.Show() != Message.OptionsEnum.Yes) return; invalid = newFileNames.Where(pair => File.Exists(pair)).Distinct().Take(InvalidCount).ToList(); if (invalid.Any()) { if (new Message(WindowParent) { Title = "Confirm", Text = $"Are you sure you want to overwrite these files:\n{string.Join("\n", invalid)}", Options = Message.OptionsEnum.YesNo, DefaultAccept = Message.OptionsEnum.Yes, DefaultCancel = Message.OptionsEnum.No, }.Show() != Message.OptionsEnum.Yes) return; } for (var ctr = 0; ctr < oldFileNames.Count; ++ctr) if (Directory.Exists(oldFileNames[ctr])) { if (move) Directory.Move(oldFileNames[ctr], newFileNames[ctr]); else CopyDirectory(oldFileNames[ctr], newFileNames[ctr]); } else { if (File.Exists(newFileNames[ctr])) File.Delete(newFileNames[ctr]); if (move) File.Move(oldFileNames[ctr], newFileNames[ctr]); else File.Copy(oldFileNames[ctr], newFileNames[ctr]); } }
public static Result Run(Window parent, NEVariables variables, bool move) { var dialog = new CopyMoveFilesDialog(variables, move) { Owner = parent }; return dialog.ShowDialog() ? dialog.result : null; }