using FileFlows.Plugin; using FileFlows.Plugin.Attributes; using FileFlows.Plugin.Helpers; namespace FileFlows.BasicNodes.File; /// /// Replaces the original file /// public class ReplaceOriginal : Node { /// /// Gets the number of inputs /// public override int Inputs => 1; /// /// Gets the number of outputs /// public override int Outputs => 1; /// /// Gets the icon to use /// public override string Icon => "fas fa-file"; /// /// Gets the help URL /// public override string HelpUrl => "https://fileflows.com/docs/plugins/basic-nodes/replace-original"; /// /// Gets the type of flow element /// public override FlowElementType Type => FlowElementType.Process; public string _Pattern = string.Empty; /// /// Gets or sets if the original files creation and last write time dates should be preserved /// [Boolean(1)] public bool PreserverOriginalDates { get; set; } /// /// Executes the node /// /// the node parameters /// the next output to execute public override int Execute(NodeParameters args) { if (args.FileName == args.WorkingFile) { args.Logger?.ILog("Working file is same as original, nothing to do."); return 1; } var wfExtension = FileHelper.GetExtension(args.WorkingFile); if (args.FileName.ToLower().EndsWith(wfExtension.ToLower())) { // easy replace var moveResult = args.MoveFile(args.FileName); if (moveResult.Failed(out var error)) { args.Logger?.ELog("Failed to move file to: " + args.FileName + " => " + error); return -1; } if(moveResult.Value == false) { args.Logger?.ELog("Failed to move file to: "+ args.FileName); return -1; } if(PreserverOriginalDates && args.Variables.TryGetValue("ORIGINAL_CREATE_UTC", out object oCreateTimeUtc) && args.Variables.TryGetValue("ORIGINAL_LAST_WRITE_UTC", out object oLastWriteUtc) && oCreateTimeUtc is DateTime dtCreateTimeUtc && oLastWriteUtc is DateTime dtLastWriteUtc) { args.FileService.SetCreationTimeUtc(args.FileName, dtCreateTimeUtc); args.FileService.SetLastWriteTimeUtc(args.FileName, dtLastWriteUtc); } } else { // different extension, we will move the file, but then delete the original string dest = FileHelper.ChangeExtension(args.FileName, wfExtension); if(args.MoveFile(dest).Failed(out var error)) { args.Logger?.ELog("Failed to move file to: " + dest + Environment.NewLine + error); return -1; } args.SetWorkingFile(dest); if (string.Equals(dest, args.FileName, StringComparison.CurrentCultureIgnoreCase) == false) { var result = args.FileService.FileDelete(args.FileName); if (result.IsFailed) { args.Logger?.ELog("Failed to delete original (with different extension): " + result.Error); return -1; } } if(PreserverOriginalDates && args.Variables.TryGetValue("ORIGINAL_CREATE_UTC", out object oCreateTimeUtc) && args.Variables.TryGetValue("ORIGINAL_LAST_WRITE_UTC", out object oLastWriteUtc) && oCreateTimeUtc is DateTime dtCreateTimeUtc && oLastWriteUtc is DateTime dtLastWriteUtc) { args.FileService.SetCreationTimeUtc(args.FileName, dtCreateTimeUtc); args.FileService.SetLastWriteTimeUtc(args.FileName, dtLastWriteUtc); } } return 1; } }