mirror of
https://github.com/revenz/FileFlowsPlugins.git
synced 2025-12-30 05:49:30 -06:00
FF-1173 - updated for new file service
This commit is contained in:
@@ -34,25 +34,6 @@ public class Delete : Node
|
||||
/// </summary>
|
||||
[TextVariable(1)] public string FileName { get; set; }
|
||||
|
||||
/// <summary>
|
||||
/// Tests if a path is a directory
|
||||
/// </summary>
|
||||
/// <param name="path">the path to test</param>
|
||||
/// <returns>true if a directory, otherwise false</returns>
|
||||
private bool IsDirectory(string path)
|
||||
{
|
||||
if (string.IsNullOrWhiteSpace(path))
|
||||
return false;
|
||||
|
||||
try
|
||||
{
|
||||
return Directory.Exists(path);
|
||||
}
|
||||
catch (Exception)
|
||||
{
|
||||
return false;
|
||||
}
|
||||
}
|
||||
|
||||
/// <summary>
|
||||
/// Executes the flow element
|
||||
@@ -65,21 +46,17 @@ public class Delete : Node
|
||||
if (string.IsNullOrEmpty(path))
|
||||
path = args.WorkingFile;
|
||||
|
||||
bool originalFile = path == args.FileName;
|
||||
if (originalFile && args.IsRemote)
|
||||
{
|
||||
args.Logger?.ILog("Deleting original file remotely: " + args.LibraryFileName);
|
||||
var result = args.DeleteRemote(args.LibraryFileName, false, null);
|
||||
return 1;
|
||||
}
|
||||
|
||||
if (IsDirectory(path))
|
||||
|
||||
if (args.FileService.DirectoryExists(path).Is(true))
|
||||
{
|
||||
try
|
||||
{
|
||||
args.Logger?.ILog("Deleting directory: " + path);
|
||||
Directory.Delete(path, true);
|
||||
args.Logger?.ILog("Deleted directory: " + path);
|
||||
var result = args.FileService.DirectoryDelete(path, true);
|
||||
if (result.IsFailed)
|
||||
args.Logger?.ELog("Failed deleting directory: "+ result.Error);
|
||||
else
|
||||
args.Logger?.ILog("Deleted directory: " + path);
|
||||
return 1;
|
||||
}
|
||||
catch (Exception ex)
|
||||
@@ -93,8 +70,11 @@ public class Delete : Node
|
||||
try
|
||||
{
|
||||
args.Logger?.ILog("Deleting file: " + path);
|
||||
System.IO.File.Delete(path);
|
||||
args.Logger?.ILog("Deleted file: " + path);
|
||||
var result = args.FileService.FileDelete(path);
|
||||
if(result.IsFailed)
|
||||
args.Logger?.ELog("Failed to Deleted file: " + result.Error);
|
||||
else
|
||||
args.Logger?.ILog("Deleted file: " + path);
|
||||
return 1;
|
||||
}
|
||||
catch (Exception ex)
|
||||
|
||||
@@ -1,5 +1,6 @@
|
||||
using FileFlows.Plugin;
|
||||
using FileFlows.Plugin.Attributes;
|
||||
using FileHelper = FileFlows.Plugin.Helpers.FileHelper;
|
||||
|
||||
namespace FileFlows.BasicNodes.File;
|
||||
|
||||
@@ -52,7 +53,7 @@ public class DeleteSourceDirectory : Node
|
||||
args.Logger?.ILog("Library File Name: " + args.LibraryFileName);
|
||||
args.Logger?.ILog("Library Path: " + path);
|
||||
args.Logger?.ILog("Relative File: " + args.RelativeFile);
|
||||
args.Logger?.ILog("IsRemote: " + args.IsRemote);
|
||||
//args.Logger?.ILog("IsRemote: " + args.IsRemote);
|
||||
|
||||
int pathIndex = args.RelativeFile.IndexOfAny(new[] { '\\', '/' });
|
||||
if (pathIndex < 0)
|
||||
@@ -63,91 +64,89 @@ public class DeleteSourceDirectory : Node
|
||||
|
||||
string topdir = args.RelativeFile.Substring(0, pathIndex);
|
||||
|
||||
string pathSeparator = args.IsRemote
|
||||
? args.LibraryPath.StartsWith("/") ? "/" : "\\"
|
||||
: Path.PathSeparator.ToString();
|
||||
|
||||
string pathSeparator = args.FileService.PathSeparator.ToString();
|
||||
|
||||
args.Logger?.ILog("Path Separator: " + pathSeparator);
|
||||
string pathToDelete = path.EndsWith(pathSeparator) ? path + topdir : path + pathSeparator + topdir;
|
||||
args.Logger?.ILog("Path To Delete: " + pathToDelete);
|
||||
|
||||
if (args.IsRemote)
|
||||
{
|
||||
if (args.LibraryFileName.StartsWith(pathToDelete))
|
||||
{
|
||||
args.Logger?.ILog("Deleting original file remotely: " + args.LibraryFileName);
|
||||
args.DeleteRemote(args.LibraryFileName, false,
|
||||
null); // first delete the source file since its in this directory we are deleting
|
||||
}
|
||||
|
||||
args.Logger?.ILog("Sending request to delete remote path: " + pathToDelete);
|
||||
// if (args.IsRemote)
|
||||
// {
|
||||
// if (args.LibraryFileName.StartsWith(pathToDelete))
|
||||
// {
|
||||
// args.Logger?.ILog("Deleting original file remotely: " + args.LibraryFileName);
|
||||
// args.DeleteRemote(args.LibraryFileName, false,
|
||||
// null); // first delete the source file since its in this directory we are deleting
|
||||
// }
|
||||
//
|
||||
// args.Logger?.ILog("Sending request to delete remote path: " + pathToDelete);
|
||||
//
|
||||
// bool deleted = args.DeleteRemote(pathToDelete, IfEmpty, IncludePatterns);
|
||||
// if (deleted)
|
||||
// args.Logger?.ILog("Successfully deleted remote path: " + pathToDelete);
|
||||
// else
|
||||
// args.Logger?.WLog("Failed to delete remote path: " + pathToDelete);
|
||||
// return deleted ? 1 : 2;
|
||||
// }
|
||||
|
||||
bool deleted = args.DeleteRemote(pathToDelete, IfEmpty, IncludePatterns);
|
||||
if (deleted)
|
||||
args.Logger?.ILog("Successfully deleted remote path: " + pathToDelete);
|
||||
else
|
||||
args.Logger?.WLog("Failed to delete remote path: " + pathToDelete);
|
||||
return deleted ? 1 : 2;
|
||||
if (IfEmpty)
|
||||
{
|
||||
string libFilePath = args.IsDirectory ? args.FileName : FileHelper.GetDirectory(args.FileName);
|
||||
return RecursiveDelete(args, path, libFilePath, true);
|
||||
}
|
||||
|
||||
try
|
||||
args.Logger?.ILog("Deleting directory: " + pathToDelete);
|
||||
var result = args.FileService.DirectoryDelete(pathToDelete, false);
|
||||
if (result.IsFailed)
|
||||
{
|
||||
if (IfEmpty)
|
||||
{
|
||||
string libFilePath = args.IsDirectory ? args.FileName : new FileInfo(args.FileName).DirectoryName;
|
||||
return RecursiveDelete(args, path, libFilePath, true);
|
||||
}
|
||||
|
||||
args.Logger?.ILog("Deleting directory: " + pathToDelete);
|
||||
Directory.Delete(pathToDelete, true);
|
||||
}
|
||||
catch (Exception ex)
|
||||
{
|
||||
args.Logger?.WLog("Failed to delete directory: " + ex.Message);
|
||||
return
|
||||
Directory.Exists(pathToDelete)
|
||||
? 2
|
||||
: 1; // silent fail, another runner may have already deleted it, eg if processing music albums
|
||||
args.Logger?.WLog("Failed to deleted directory: " + result.Error);
|
||||
return 2;
|
||||
}
|
||||
|
||||
return base.Execute(args);
|
||||
return 1;
|
||||
}
|
||||
|
||||
private int RecursiveDelete(NodeParameters args, string root, string path, bool deleteSubFolders)
|
||||
{
|
||||
if (string.IsNullOrWhiteSpace(path))
|
||||
return 1;
|
||||
|
||||
args.Logger?.ILog("Checking directory to delete: " + path);
|
||||
DirectoryInfo dir = new DirectoryInfo(path);
|
||||
if (dir.FullName.ToLower() == root.ToLower())
|
||||
//DirectoryInfo dir = new DirectoryInfo(path);
|
||||
var dirFullName = FileHelper.GetDirectory(path);
|
||||
if (string.Equals(dirFullName, root, StringComparison.CurrentCultureIgnoreCase))
|
||||
{
|
||||
args.Logger?.ILog("At root, stopping deleting: " + root);
|
||||
return 1;
|
||||
}
|
||||
|
||||
if (dir.FullName.Length <= root.Length)
|
||||
if (dirFullName.Length <= root.Length)
|
||||
{
|
||||
args.Logger?.ILog("At root2, stopping deleting: " + root);
|
||||
return 1;
|
||||
}
|
||||
|
||||
if (deleteSubFolders == false && dir.GetDirectories().Any())
|
||||
if (deleteSubFolders == false)
|
||||
{
|
||||
args.Logger?.ILog("Directory contains subfolders, cannot delete: " + dir.FullName);
|
||||
return 2;
|
||||
if (args.FileService.GetDirectories(path).ValueOrDefault?.Any() == true)
|
||||
{
|
||||
args.Logger?.ILog("Directory contains subfolders, cannot delete: " + path);
|
||||
return 2;
|
||||
}
|
||||
}
|
||||
|
||||
var files = dir.GetFiles("*.*", SearchOption.AllDirectories);
|
||||
var files = args.FileService.GetFiles(path, "*.*", true).ValueOrDefault ?? new string [] {};
|
||||
if (IncludePatterns?.Any() == true)
|
||||
{
|
||||
var count = files.Where(x =>
|
||||
{
|
||||
foreach (var pattern in IncludePatterns)
|
||||
{
|
||||
if (x.FullName.Contains(pattern))
|
||||
if (x.Contains(pattern))
|
||||
return true;
|
||||
try
|
||||
{
|
||||
if (System.Text.RegularExpressions.Regex.IsMatch(x.FullName, pattern,
|
||||
if (System.Text.RegularExpressions.Regex.IsMatch(x, pattern,
|
||||
System.Text.RegularExpressions.RegexOptions.IgnoreCase))
|
||||
return true;
|
||||
}
|
||||
@@ -160,27 +159,28 @@ public class DeleteSourceDirectory : Node
|
||||
}).Count();
|
||||
if (count > 0)
|
||||
{
|
||||
args.Logger?.ILog("Directory is not empty, cannot delete: " + dir.FullName);
|
||||
args.Logger?.ILog("Directory is not empty, cannot delete: " + path);
|
||||
return 2;
|
||||
}
|
||||
}
|
||||
else if (files.Length == 0)
|
||||
{
|
||||
args.Logger?.ILog("Directory is not empty, cannot delete: " + dir.FullName);
|
||||
args.Logger?.ILog("Directory is not empty, cannot delete: " + path);
|
||||
return 2;
|
||||
}
|
||||
|
||||
args.Logger?.ILog("Deleting directory: " + dir.FullName);
|
||||
args.Logger?.ILog("Deleting directory: " + path);
|
||||
try
|
||||
{
|
||||
dir.Delete(true);
|
||||
args.FileService.DirectoryDelete(path, true);
|
||||
}
|
||||
catch (Exception ex)
|
||||
{
|
||||
args.Logger?.WLog("Failed to delete directory: " + ex.Message);
|
||||
return dir.Exists ? 2 : 1; // silently fail
|
||||
return args.FileService.DirectoryExists(path).Is(true) ? 2 : 1; // silently fail
|
||||
}
|
||||
|
||||
return RecursiveDelete(args, root, dir.Parent.FullName, false);
|
||||
string parent = FileHelper.GetDirectory(path);
|
||||
return RecursiveDelete(args, root, parent, false);
|
||||
}
|
||||
}
|
||||
@@ -26,15 +26,24 @@ public class FileExists: Node
|
||||
}
|
||||
try
|
||||
{
|
||||
file = args.MapPath(file);
|
||||
var fileInfo = new FileInfo(file);
|
||||
if (fileInfo.Exists)
|
||||
var result = args.FileService.FileExists(file);
|
||||
if (result.Is(true))
|
||||
{
|
||||
args.Logger?.ILog("File does exist: " + file);
|
||||
return 1;
|
||||
}
|
||||
args.Logger?.ILog("File does NOT exist: " + file);
|
||||
return 2;
|
||||
|
||||
// file = args.MapPath(file);
|
||||
// var fileInfo = new FileInfo(file);
|
||||
// if (fileInfo.Exists)
|
||||
// {
|
||||
// args.Logger?.ILog("File does exist: " + file);
|
||||
// return 1;
|
||||
// }
|
||||
// args.Logger?.ILog("File does NOT exist: " + file);
|
||||
// return 2;
|
||||
}
|
||||
catch (Exception ex)
|
||||
{
|
||||
|
||||
@@ -21,13 +21,14 @@ namespace FileFlows.BasicNodes.File
|
||||
|
||||
public override int Execute(NodeParameters args)
|
||||
{
|
||||
var fi = new FileInfo(args.WorkingFile);
|
||||
if (fi.Exists == false) {
|
||||
var result = args.FileService.FileSize(args.WorkingFile);
|
||||
if(result.IsFailed)
|
||||
{
|
||||
args.Logger.ELog("File Does not exist: " + args.WorkingFile);
|
||||
return -1;
|
||||
}
|
||||
|
||||
return TestSize(args, fi.Length);
|
||||
return TestSize(args, result.ValueOrDefault);
|
||||
}
|
||||
|
||||
public int TestSize(NodeParameters args, long size)
|
||||
|
||||
@@ -15,9 +15,10 @@ namespace FileFlows.BasicNodes.File
|
||||
|
||||
public override int Execute(NodeParameters args)
|
||||
{
|
||||
FileInfo fiOriginal = new FileInfo(args.FileName);
|
||||
float origSize = 0;
|
||||
if (fiOriginal.Exists == false)
|
||||
//FileInfo fiOriginal = new FileInfo(args.FileName);
|
||||
var result = args.FileService.FileSize(args.FileName);
|
||||
long origSize = result.ValueOrDefault;
|
||||
if (result.IsFailed)
|
||||
{
|
||||
// try get from variables
|
||||
if (args.Variables.ContainsKey("file.Orig.Size") && args.Variables["file.Orig.Size"] is long tSize && tSize > 0)
|
||||
@@ -30,14 +31,11 @@ namespace FileFlows.BasicNodes.File
|
||||
return -1;
|
||||
}
|
||||
}
|
||||
else
|
||||
{
|
||||
origSize = fiOriginal.Length;
|
||||
}
|
||||
|
||||
float wfSize = 0;
|
||||
FileInfo fiWorkingFile = new FileInfo(args.WorkingFile);
|
||||
if (fiWorkingFile.Exists == false)
|
||||
//FileInfo fiWorkingFile = new FileInfo(args.WorkingFile);
|
||||
result = args.FileService.FileSize(args.WorkingFile);
|
||||
long wfSize = result.ValueOrDefault;
|
||||
if (result.IsFailed)
|
||||
{
|
||||
if (args.WorkingFileSize > 0)
|
||||
{
|
||||
@@ -49,14 +47,10 @@ namespace FileFlows.BasicNodes.File
|
||||
return -1;
|
||||
}
|
||||
}
|
||||
else
|
||||
{
|
||||
wfSize = fiWorkingFile.Length;
|
||||
}
|
||||
|
||||
|
||||
args.Logger?.ILog("Original File Size: " + String.Format("{0:n0}", origSize));
|
||||
args.Logger?.ILog("Working File Size: " + String.Format("{0:n0}", wfSize));
|
||||
args.Logger?.ILog($"Original File Size: {origSize:n0}");
|
||||
args.Logger?.ILog($"Working File Size: {wfSize:n0}");
|
||||
|
||||
|
||||
if (wfSize > origSize)
|
||||
|
||||
@@ -33,14 +33,14 @@ public class InputFile : Node
|
||||
{
|
||||
try
|
||||
{
|
||||
FileInfo fileInfo = new FileInfo(args.WorkingFile);
|
||||
if (fileInfo.Exists == false)
|
||||
if(args.FileService.FileExists(args.WorkingFile).Is(true) == false)
|
||||
{
|
||||
args.Logger?.ELog("File not found: " + args.WorkingFile);
|
||||
return -1;
|
||||
}
|
||||
args.Variables["ORIGINAL_CREATE_UTC"] = fileInfo.CreationTimeUtc;
|
||||
args.Variables["ORIGINAL_LAST_WRITE_UTC"] = fileInfo.LastWriteTimeUtc;
|
||||
|
||||
args.Variables["ORIGINAL_CREATE_UTC"] = args.FileService.FileCreationTimeUtc(args.WorkingFile).ValueOrDefault;
|
||||
args.Variables["ORIGINAL_LAST_WRITE_UTC"] = args.FileService.FileLastWriteTimeUtc(args.WorkingFile).ValueOrDefault;
|
||||
return 1;
|
||||
}
|
||||
catch (Exception ex)
|
||||
|
||||
@@ -14,8 +14,7 @@ namespace FileFlows.BasicNodes.File
|
||||
{
|
||||
try
|
||||
{
|
||||
var info = new DirectoryInfo(args.WorkingFile);
|
||||
if (info.Exists == false)
|
||||
if (args.FileService.DirectoryExists(args.WorkingFile).Is(true) == false)
|
||||
{
|
||||
args.Logger?.ELog("Directory not found: " + args.WorkingFile);
|
||||
return -1;
|
||||
|
||||
@@ -1,60 +0,0 @@
|
||||
// namespace FileFlows.BasicNodes.File;
|
||||
//
|
||||
// using System.ComponentModel;
|
||||
// using FileFlows.Plugin;
|
||||
// using FileFlows.Plugin.Attributes;
|
||||
//
|
||||
// /// <summary>
|
||||
// /// Node that checks if a file is older than
|
||||
// /// </summary>
|
||||
// public class OlderThan : Node
|
||||
// {
|
||||
// public override int Inputs => 1;
|
||||
// public override int Outputs => 2;
|
||||
// public override FlowElementType Type => FlowElementType.Logic;
|
||||
// public override string Icon => "fas fa-clock";
|
||||
// public override string HelpUrl => "https://fileflows.com/docs/plugins/basic-nodes/older-than";
|
||||
//
|
||||
// [Period(1)]
|
||||
// public int Minutes { get; set; }
|
||||
//
|
||||
// [NumberInt(2)]
|
||||
// [Select(nameof(DateOptions), 1)]
|
||||
// public int Date { get; set; }
|
||||
//
|
||||
// private static List<ListOption> _DateOptions;
|
||||
// /// <summary>
|
||||
// /// Gets or sets the date options
|
||||
// /// </summary>
|
||||
// public static List<ListOption> DateOptions
|
||||
// {
|
||||
// get
|
||||
// {
|
||||
// if (_DateOptions == null)
|
||||
// {
|
||||
// _DateOptions = new List<ListOption>
|
||||
// {
|
||||
// new () { Label = "Date Created", Value = 0 },
|
||||
// new () { Label = "Date Modified", Value = 1 }
|
||||
// };
|
||||
// }
|
||||
// return _DateOptions;
|
||||
// }
|
||||
// }
|
||||
//
|
||||
// public override int Execute(NodeParameters args)
|
||||
// {
|
||||
// var fi = new FileInfo(args.WorkingFile);
|
||||
//
|
||||
// if (fi.Exists == false)
|
||||
// {
|
||||
// args.Logger.ELog("File Does not exist: " + args.WorkingFile);
|
||||
// return -1;
|
||||
// }
|
||||
//
|
||||
// var date = Date == 1 ? fi.LastWriteTime : fi.CreationTime;
|
||||
//
|
||||
// var minutes = DateTime.Now.Subtract(date).TotalMinutes;
|
||||
// return minutes > this.Minutes ? 1 : 2;
|
||||
// }
|
||||
// }
|
||||
@@ -1,4 +1,6 @@
|
||||
namespace FileFlows.BasicNodes.Functions;
|
||||
using FileFlows.Plugin.Helpers;
|
||||
|
||||
namespace FileFlows.BasicNodes.Functions;
|
||||
|
||||
using System.ComponentModel.DataAnnotations;
|
||||
using System.Text.RegularExpressions;
|
||||
@@ -32,7 +34,8 @@ public class PatternReplacer : Node
|
||||
|
||||
try
|
||||
{
|
||||
string filename = new FileInfo(UseWorkingFileName ? args.WorkingFile : args.FileName).Name;
|
||||
//string filename = new FileInfo(UseWorkingFileName ? args.WorkingFile : args.FileName).Name;
|
||||
string filename = FileHelper.GetShortFileName(UseWorkingFileName ? args.WorkingFile : args.FileName);
|
||||
string updated = RunReplacements(args, filename);
|
||||
|
||||
if (updated == filename)
|
||||
@@ -43,20 +46,19 @@ public class PatternReplacer : Node
|
||||
|
||||
args.Logger?.ILog($"Pattern replacement: '{filename}' to '{updated}'");
|
||||
|
||||
string dest = Path.Combine(new FileInfo(args.WorkingFile)?.DirectoryName ?? string.Empty, updated);
|
||||
string directory = FileHelper.GetDirectory(args.WorkingFile);
|
||||
string dest = directory + args.FileService.PathSeparator + updated;
|
||||
args.Logger?.ILog($"New filename: " + dest);
|
||||
if (UnitTest == false)
|
||||
{
|
||||
if (args.MoveFile(dest) == false)
|
||||
var result = args.FileService.FileMove(args.WorkingFile, dest, true);
|
||||
if(result.IsFailed)
|
||||
{
|
||||
args.Logger?.ELog("Failed to move file");
|
||||
args.Logger?.ELog("Failed to move file: " + result.Error);
|
||||
return -1;
|
||||
}
|
||||
}
|
||||
else
|
||||
{
|
||||
args.SetWorkingFile(dest);
|
||||
}
|
||||
args.SetWorkingFile(dest);
|
||||
return 1;
|
||||
}
|
||||
catch (Exception ex)
|
||||
|
||||
@@ -1,11 +1,12 @@
|
||||
namespace FileFlows.BasicNodes.File;
|
||||
|
||||
using FileFlows.Plugin.Helpers;
|
||||
using System.ComponentModel.DataAnnotations;
|
||||
using System.Text;
|
||||
using System.Text.RegularExpressions;
|
||||
using FileFlows.Plugin;
|
||||
using FileFlows.Plugin.Attributes;
|
||||
|
||||
namespace FileFlows.BasicNodes.File;
|
||||
|
||||
public class Renamer : Node
|
||||
{
|
||||
public override int Inputs => 1;
|
||||
@@ -50,7 +51,7 @@ public class Renamer : Node
|
||||
}
|
||||
|
||||
string newFile = Pattern;
|
||||
// incase they set a linux path on windows or vice versa
|
||||
// in case they set a linux path on windows or vice versa
|
||||
newFile = newFile.Replace('\\', Path.DirectorySeparatorChar);
|
||||
newFile = newFile.Replace('/', Path.DirectorySeparatorChar);
|
||||
|
||||
@@ -67,36 +68,37 @@ public class Renamer : Node
|
||||
|
||||
string destFolder = args.ReplaceVariables(DestinationPath ?? string.Empty, stripMissing: true, cleanSpecialCharacters: true);
|
||||
if (string.IsNullOrEmpty(destFolder))
|
||||
destFolder = new FileInfo(args.WorkingFile).Directory?.FullName ?? "";
|
||||
destFolder = FileHelper.GetDirectory(args.WorkingFile);
|
||||
|
||||
var dest = args.GetSafeName(Path.Combine(destFolder, newFile));
|
||||
if (destFolder.EndsWith("/") | destFolder.EndsWith(@"\"))
|
||||
destFolder = destFolder[..^1];
|
||||
|
||||
if (string.IsNullOrEmpty(dest.Extension) == false)
|
||||
var dest = args.GetSafeName(destFolder + args.FileService.PathSeparator + newFile);
|
||||
|
||||
string destExtension = FileHelper.GetExtension(dest);
|
||||
|
||||
if (string.IsNullOrEmpty(destExtension) == false)
|
||||
{
|
||||
// just ensures extensions are lowercased
|
||||
dest = new FileInfo(dest.FullName.Substring(0, dest.FullName.LastIndexOf(dest.Extension)) + dest.Extension.ToLower());
|
||||
dest = dest[..dest.LastIndexOf(destExtension, StringComparison.Ordinal)] +
|
||||
destExtension.ToLower();
|
||||
}
|
||||
|
||||
|
||||
|
||||
args.Logger?.ILog("Renaming file to: " + dest.FullName);
|
||||
args.Logger?.ILog("Renaming file to: " + dest);
|
||||
|
||||
if (string.IsNullOrEmpty(CsvFile) == false)
|
||||
{
|
||||
try
|
||||
{
|
||||
System.IO.File.AppendAllText(CsvFile, EscapeForCsv(args.FileName) + "," + EscapeForCsv(dest.FullName) + Environment.NewLine);
|
||||
}
|
||||
catch (Exception ex)
|
||||
{
|
||||
args.Logger?.ELog("Failed to append to CSV file: " + ex.Message);
|
||||
}
|
||||
var result = args.FileService.FileAppendAllText(CsvFile, EscapeForCsv(args.FileName) + "," + EscapeForCsv(dest) + Environment.NewLine);
|
||||
if(result.IsFailed)
|
||||
args.Logger?.ELog("Failed to append to CSV file: " + result.Error);
|
||||
}
|
||||
|
||||
if (LogOnly)
|
||||
return 1;
|
||||
|
||||
return args.MoveFile(dest.FullName) ? 1 : -1;
|
||||
return args.MoveFile(dest) ? 1 : -1;
|
||||
}
|
||||
|
||||
private string EscapeForCsv(string input)
|
||||
|
||||
@@ -1,5 +1,6 @@
|
||||
using FileFlows.Plugin;
|
||||
using FileFlows.Plugin.Attributes;
|
||||
using FileFlows.Plugin.Helpers;
|
||||
|
||||
namespace FileFlows.BasicNodes.File;
|
||||
|
||||
@@ -48,9 +49,9 @@ public class ReplaceOriginal : Node
|
||||
{
|
||||
args.Logger?.ILog("Working file is same as original, nothing to do.");
|
||||
return 1;
|
||||
}
|
||||
var wf = new FileInfo(args.WorkingFile);
|
||||
if (args.FileName.ToLower().EndsWith(wf.Extension.ToLower()))
|
||||
};
|
||||
var wfExtension = FileHelper.GetExtension(args.WorkingFile);
|
||||
if (args.FileName.ToLower().EndsWith(wfExtension.ToLower()))
|
||||
{
|
||||
// easy replace
|
||||
bool moved = args.MoveFile(args.FileName);
|
||||
@@ -64,39 +65,37 @@ public class ReplaceOriginal : Node
|
||||
args.Variables.TryGetValue("ORIGINAL_LAST_WRITE_UTC", out object oLastWriteUtc) &&
|
||||
oCreateTimeUtc is DateTime dtCreateTimeUtc && oLastWriteUtc is DateTime dtLastWriteUtc)
|
||||
{
|
||||
Helpers.FileHelper.SetCreationTime(args.FileName, dtCreateTimeUtc);
|
||||
Helpers.FileHelper.SetLastWriteTime(args.FileName, 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 = Path.ChangeExtension(args.FileName, wf.Extension);
|
||||
string dest = Path.ChangeExtension(args.FileName, wfExtension);
|
||||
if(args.MoveFile(dest) == false)
|
||||
{
|
||||
args.Logger?.ELog("Failed to move file to: " + dest);
|
||||
return -1;
|
||||
}
|
||||
if (dest.ToLower() != args.FileName.ToLower())
|
||||
|
||||
if (string.Equals(dest, args.FileName, StringComparison.CurrentCultureIgnoreCase) == false)
|
||||
{
|
||||
try
|
||||
var result = args.FileService.FileDelete(args.FileName);
|
||||
if (result.IsFailed)
|
||||
{
|
||||
System.IO.File.Delete(args.FileName);
|
||||
}
|
||||
catch (Exception ex)
|
||||
{
|
||||
args.Logger?.ELog("Failed to delete orginal (with different extension): " + ex.Message);
|
||||
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)
|
||||
{
|
||||
Helpers.FileHelper.SetCreationTime(dest, dtCreateTimeUtc);
|
||||
Helpers.FileHelper.SetLastWriteTime(dest, dtLastWriteUtc);
|
||||
args.FileService.SetCreationTimeUtc(args.FileName, dtCreateTimeUtc);
|
||||
args.FileService.SetLastWriteTimeUtc(args.FileName, dtLastWriteUtc);
|
||||
}
|
||||
}
|
||||
|
||||
|
||||
@@ -11,7 +11,6 @@ public class Touch : Node
|
||||
public override string Icon => "fas fa-hand-point-right";
|
||||
public override string HelpUrl => "https://fileflows.com/docs/plugins/basic-nodes/touch";
|
||||
|
||||
|
||||
[TextVariable(1)]
|
||||
public string FileName { get; set; }
|
||||
|
||||
@@ -20,48 +19,14 @@ public class Touch : Node
|
||||
string filename = args.ReplaceVariables(this.FileName ?? string.Empty, stripMissing: true);
|
||||
if (string.IsNullOrEmpty(filename))
|
||||
filename = args.WorkingFile;
|
||||
|
||||
|
||||
if (IsDirectory(filename))
|
||||
var result = args.FileService.Touch(filename);
|
||||
if (result.IsFailed)
|
||||
{
|
||||
args.Logger?.ILog("Touching directory: " + filename);
|
||||
try
|
||||
{
|
||||
var dir = new DirectoryInfo(filename);
|
||||
Directory.SetLastWriteTimeUtc(filename, DateTime.UtcNow);
|
||||
return 1;
|
||||
}
|
||||
catch (Exception ex)
|
||||
{
|
||||
args.Logger?.ELog("Failed to touch directory: " + ex.Message);
|
||||
return -1;
|
||||
}
|
||||
args.Logger?.ELog("Failed to touch: " + result.Error);
|
||||
return -1;
|
||||
}
|
||||
else
|
||||
{
|
||||
args.Logger?.ILog("Touching file: " + filename);
|
||||
try
|
||||
{
|
||||
if (System.IO.File.Exists(filename))
|
||||
System.IO.File.SetLastWriteTimeUtc(filename, DateTime.UtcNow);
|
||||
else
|
||||
System.IO.File.Create(filename);
|
||||
return 1;
|
||||
}
|
||||
catch (Exception ex)
|
||||
{
|
||||
args.Logger?.ELog($"Failed to touch file: '{filename}' => {ex.Message}");
|
||||
return -1;
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
private bool IsDirectory(string filename)
|
||||
{
|
||||
try
|
||||
{
|
||||
return new DirectoryInfo(filename).Exists;
|
||||
}
|
||||
catch (Exception) { return false; }
|
||||
return 1;
|
||||
}
|
||||
}
|
||||
|
||||
@@ -1,6 +1,7 @@
|
||||
using System.ComponentModel;
|
||||
using FileFlows.Plugin;
|
||||
using FileFlows.Plugin.Attributes;
|
||||
using FileFlows.Plugin.Helpers;
|
||||
|
||||
namespace FileFlows.BasicNodes.File;
|
||||
|
||||
@@ -129,15 +130,31 @@ public class SevenZip : Node
|
||||
try
|
||||
{
|
||||
string itemToCompress = args.WorkingFile;
|
||||
if (System.IO.Directory.Exists(args.WorkingFile))
|
||||
if (Directory.Exists(args.WorkingFile))
|
||||
{
|
||||
if (args.IsRemote)
|
||||
{
|
||||
args.Logger?.ELog("Cannot 7-zip a remote folder");
|
||||
return -1;
|
||||
}
|
||||
isDir = true;
|
||||
itemToCompress = Path.Combine(args.WorkingFile, "*");
|
||||
}
|
||||
else if (System.IO.File.Exists(args.WorkingFile) == false)
|
||||
else
|
||||
{
|
||||
args.Logger?.ELog("File or folder does not exist: " + args.WorkingFile);
|
||||
return -1;
|
||||
if (args.FileService.FileExists(args.WorkingFile))
|
||||
{
|
||||
args.Logger?.ELog("File does not exist: " + args.WorkingFile);
|
||||
return 1;
|
||||
}
|
||||
var result = args.FileService.GetLocalPath(args.WorkingFile);
|
||||
if (result.IsFailed)
|
||||
{
|
||||
args.Logger?.ELog("Failed to ensure file is local: " + result.Error);
|
||||
return -1;
|
||||
}
|
||||
|
||||
itemToCompress = result;
|
||||
}
|
||||
|
||||
string sevenZip = args.GetToolPath("7zip")?.EmptyAsNull() ?? "7z";
|
||||
@@ -149,7 +166,8 @@ public class SevenZip : Node
|
||||
if (isDir)
|
||||
destDir = new DirectoryInfo(args.LibraryPath).FullName;
|
||||
else
|
||||
destDir = new FileInfo(args.FileName)?.DirectoryName ?? String.Empty;
|
||||
destDir = FileHelper.GetDirectory(args.FileName);
|
||||
|
||||
if (string.IsNullOrEmpty(destDir))
|
||||
{
|
||||
args.Logger?.ELog("Failed to get destination directory");
|
||||
@@ -164,9 +182,15 @@ public class SevenZip : Node
|
||||
|
||||
destDir = args.ReplaceVariables(destDir, stripMissing: true);
|
||||
|
||||
destDir = destDir.TrimEnd(Path.PathSeparator);
|
||||
|
||||
// this converts it to the actual OS path
|
||||
destDir = new DirectoryInfo(destDir).FullName;
|
||||
args.CreateDirectoryIfNotExists(destDir);
|
||||
var result = args.FileService.DirectoryCreate(destDir);
|
||||
if (result.IsFailed)
|
||||
{
|
||||
args.Logger?.ELog("Failed creating directory: " + result.Error);
|
||||
return -1;
|
||||
}
|
||||
}
|
||||
args.Logger?.ILog("Destination Folder: " + destDir);
|
||||
|
||||
@@ -176,32 +200,31 @@ public class SevenZip : Node
|
||||
if (isDir)
|
||||
destFile = new DirectoryInfo(args.FileName).Name + ".7z";
|
||||
else
|
||||
destFile = new FileInfo(args.FileName).Name + ".7z";
|
||||
destFile = FileHelper.GetShortFileName(args.FileName) + ".7z";
|
||||
}
|
||||
if (destFile.ToLower().EndsWith(".7z") == false)
|
||||
destFile += ".7z";
|
||||
destFile = Path.Combine(destDir, destFile);
|
||||
destFile = destDir + args.FileService.PathSeparator + destFile;
|
||||
|
||||
args.Logger?.ILog($"Compressing '{args.WorkingFile}' to '{destFile}'");
|
||||
|
||||
int compression = CompressionLevel < 1 ? 5 : CompressionLevel;
|
||||
|
||||
if (System.IO.File.Exists(destFile))
|
||||
if (args.FileService.FileExists(destFile).Is(true))
|
||||
{
|
||||
args.Logger?.ILog("Destination file already exists, deleting: " + destFile);
|
||||
try
|
||||
var result = args.FileService.FileDelete(destFile);
|
||||
if (result.IsFailed)
|
||||
{
|
||||
System.IO.File.Delete(destFile);
|
||||
}
|
||||
catch (Exception ex)
|
||||
{
|
||||
args.Logger?.ILog("Failed to delete existing file: " + ex.Message);
|
||||
args.Logger?.ILog("Failed to delete existing file: " + result.Error);
|
||||
return -1;
|
||||
}
|
||||
}
|
||||
|
||||
string compressionMethod = CompressionMethod?.EmptyAsNull() ?? "lzma2";
|
||||
|
||||
string targetFile = args.IsRemote ? Path.Combine(args.TempPath, Guid.NewGuid() + ".7zip") : destFile;
|
||||
|
||||
args.Execute(new()
|
||||
{
|
||||
Command = sevenZip,
|
||||
@@ -209,19 +232,30 @@ public class SevenZip : Node
|
||||
{
|
||||
"a", "-t7z", $"-m0={compressionMethod}",
|
||||
$"-mx{compression}",
|
||||
destFile, itemToCompress
|
||||
targetFile, itemToCompress
|
||||
}
|
||||
});
|
||||
|
||||
if (System.IO.File.Exists(destFile))
|
||||
|
||||
if (System.IO.File.Exists(targetFile) == false)
|
||||
{
|
||||
args.SetWorkingFile(destFile);
|
||||
args.Logger?.ILog("7z created at: " + destFile);
|
||||
return 1;
|
||||
args.Logger?.ELog("Failed to create 7z: " + destFile);
|
||||
return -1;
|
||||
}
|
||||
|
||||
args.Logger?.ELog("Failed to create 7z: " + destFile);
|
||||
return -1;
|
||||
if (targetFile != destFile)
|
||||
{
|
||||
// need to move the file
|
||||
var result = args.FileService.FileMove(targetFile, destFile, true);
|
||||
if (result.IsFailed)
|
||||
{
|
||||
args.Logger?.ELog("Failed to move 7z file: " + result.Error);
|
||||
return -1;
|
||||
}
|
||||
}
|
||||
|
||||
args.SetWorkingFile(destFile);
|
||||
args.Logger?.ILog("7z created at: " + destFile);
|
||||
return 1;
|
||||
}
|
||||
catch (Exception ex)
|
||||
{
|
||||
|
||||
Binary file not shown.
Binary file not shown.
@@ -301,7 +301,7 @@ public class FfmpegBuilderExecutor: FfmpegBuilderNode
|
||||
|
||||
private static readonly bool IsMac = RuntimeInformation.IsOSPlatform(OSPlatform.OSX);
|
||||
|
||||
|
||||
|
||||
private string[][] Decoders_h264(NodeParameters args)
|
||||
{
|
||||
bool noNvidia =
|
||||
|
||||
Reference in New Issue
Block a user