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;
}
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;
}
}