From acfbefca00b9ed1e88deb26d371437bb13327850 Mon Sep 17 00:00:00 2001 From: Jason Alborough Date: Tue, 15 Mar 2022 09:33:06 -0400 Subject: [PATCH 1/6] feature: add static fileio class to read and write files --- .../PepperDashEssentialsBase/File/FileIO.cs | 163 ++++++++++++++++++ .../PepperDash_Essentials_Core.csproj | 1 + 2 files changed, 164 insertions(+) create mode 100644 essentials-framework/Essentials Core/PepperDashEssentialsBase/File/FileIO.cs diff --git a/essentials-framework/Essentials Core/PepperDashEssentialsBase/File/FileIO.cs b/essentials-framework/Essentials Core/PepperDashEssentialsBase/File/FileIO.cs new file mode 100644 index 00000000..cc67e8da --- /dev/null +++ b/essentials-framework/Essentials Core/PepperDashEssentialsBase/File/FileIO.cs @@ -0,0 +1,163 @@ +using System; +using System.Collections.Generic; +using System.Linq; +using System.Text; +using Crestron.SimplSharp; +using Crestron.SimplSharp.CrestronIO; +using PepperDash.Core; + +namespace PepperDash.Essentials.Core +{ + public static class FileIO + { + + static CCriticalSection fileLock = new CCriticalSection(); + /// + /// + /// + /// + /// + public static bool FileExsists(string fileName) + { + if (GetFile(fileName) == null) + { + return false; + } + else + { + return true; + } + } + /// + /// Get the full file info from a path/filename, can include wildcards. + /// + /// + /// + public static FileInfo[] GetFiles(string fileName) + { + DirectoryInfo dirInfo = new DirectoryInfo(Path.GetDirectoryName(fileName)); + var files = dirInfo.GetFiles(Path.GetFileName(fileName)); + Debug.Console(0, "FileIO found: {0}, {1}", files.Count(), fileName); + if (files.Count() > 0) + { + return files; + } + else + { + return null; + } + } + + public static FileInfo GetFile(string fileName) + { + DirectoryInfo dirInfo = new DirectoryInfo(Path.GetDirectoryName(fileName)); + var files = dirInfo.GetFiles(Path.GetFileName(fileName)); + Debug.Console(0, "FileIO found: {0}, {1}", files.Count(), fileName); + if (files.Count() > 0) + { + return files.FirstOrDefault(); + } + else + { + return null; + } + } + + + /// + /// Get the data from a fileName + /// + /// + /// + public static string GetDataFromFile(FileInfo file) + { + try + { + DirectoryInfo dirInfo = new DirectoryInfo(file.Name); + Debug.Console(2, "FileIO Getting Data {0}", file.FullName); + + if (File.Exists(file.FullName)) + { + using (StreamReader r = new StreamReader(file.FullName)) + { + return r.ReadToEnd(); + } + } + else + { + Debug.Console(2, "File {0} Does not exsist", file.FullName); + return ""; + } + + } + catch (Exception e) + { + Debug.Console(0, Debug.ErrorLogLevel.Error, "Error: FileIO read failed: \r{0}", e); + return ""; + } + } + + /// + /// + /// + /// + /// + public static void WriteDataToFile(string data, string filePath) + { + Debug.Console(0, Debug.ErrorLogLevel.Notice, "Attempting to write file: '{0}'", filePath); + + try + { + if (fileLock.TryEnter()) + { + using (StreamWriter sw = new StreamWriter(filePath)) + { + sw.Write(data); + sw.Flush(); + } + + } + else + { + Debug.Console(0, Debug.ErrorLogLevel.Error, "FileIO Unable to enter FileLock"); + } + + } + catch (Exception e) + { + Debug.Console(0, Debug.ErrorLogLevel.Error, "Error: FileIO write failed: \r{0}", e); + } + finally + { + if (fileLock != null && !fileLock.Disposed) + fileLock.Leave(); + + } + } + + /// + /// + /// + /// + public static bool FileIoUnitTest() + { + var testData = "Testing FileIO"; + FileIO.WriteDataToFile(testData, "\\USER\\FileIOTest.pdt"); + + var file = FileIO.GetFile("\\USER\\*FileIOTest*"); + + var readData = FileIO.GetDataFromFile(file); + Debug.Console(0, "Returned {0}", readData); + File.Delete(file.FullName); + if (testData == readData) + { + return true; + } + else + { + return false; + } + } + + } +} \ No newline at end of file diff --git a/essentials-framework/Essentials Core/PepperDashEssentialsBase/PepperDash_Essentials_Core.csproj b/essentials-framework/Essentials Core/PepperDashEssentialsBase/PepperDash_Essentials_Core.csproj index cdf6406c..7123a150 100644 --- a/essentials-framework/Essentials Core/PepperDashEssentialsBase/PepperDash_Essentials_Core.csproj +++ b/essentials-framework/Essentials Core/PepperDashEssentialsBase/PepperDash_Essentials_Core.csproj @@ -224,6 +224,7 @@ + From 281b6f065f234d3b2934f7e04af6f61b72b0a17b Mon Sep 17 00:00:00 2001 From: Jason Alborough Date: Mon, 21 Mar 2022 17:06:18 -0400 Subject: [PATCH 2/6] fix: remove method FileExsists fix: fixed casing in debug statement fix: changed the method name to ReadDataFromFile. feature: added an overload ReadDataFromFile(string) --- .../PepperDashEssentialsBase/File/FileIO.cs | 19 ++----------------- 1 file changed, 2 insertions(+), 17 deletions(-) diff --git a/essentials-framework/Essentials Core/PepperDashEssentialsBase/File/FileIO.cs b/essentials-framework/Essentials Core/PepperDashEssentialsBase/File/FileIO.cs index cc67e8da..ffc0bfe3 100644 --- a/essentials-framework/Essentials Core/PepperDashEssentialsBase/File/FileIO.cs +++ b/essentials-framework/Essentials Core/PepperDashEssentialsBase/File/FileIO.cs @@ -12,22 +12,7 @@ namespace PepperDash.Essentials.Core { static CCriticalSection fileLock = new CCriticalSection(); - /// - /// - /// - /// - /// - public static bool FileExsists(string fileName) - { - if (GetFile(fileName) == null) - { - return false; - } - else - { - return true; - } - } + /// /// Get the full file info from a path/filename, can include wildcards. /// @@ -69,7 +54,7 @@ namespace PepperDash.Essentials.Core /// /// /// - public static string GetDataFromFile(FileInfo file) + public static string ReadDataFromFile(FileInfo file) { try { From c539c791358501e2cd8e4c340201830580cc2980 Mon Sep 17 00:00:00 2001 From: Jason Alborough Date: Mon, 21 Mar 2022 17:08:36 -0400 Subject: [PATCH 3/6] fix: fix case on \user\ folder path for four series support. --- .../PepperDashEssentialsBase/File/FileIO.cs | 28 +++++++++++++++---- 1 file changed, 23 insertions(+), 5 deletions(-) diff --git a/essentials-framework/Essentials Core/PepperDashEssentialsBase/File/FileIO.cs b/essentials-framework/Essentials Core/PepperDashEssentialsBase/File/FileIO.cs index ffc0bfe3..f8bae252 100644 --- a/essentials-framework/Essentials Core/PepperDashEssentialsBase/File/FileIO.cs +++ b/essentials-framework/Essentials Core/PepperDashEssentialsBase/File/FileIO.cs @@ -47,10 +47,28 @@ namespace PepperDash.Essentials.Core return null; } } - + /// - /// Get the data from a fileName + /// Get the data from string path/filename + /// + /// + /// + public static string ReadDataFromFile(string fileName) + { + try + { + return ReadDataFromFile(GetFile(fileName)); + } + catch (Exception e) + { + Debug.Console(0, Debug.ErrorLogLevel.Error, "Error: FileIO read failed: \r{0}", e); + return ""; + } + } + + /// + /// Get the data with fileInfo object /// /// /// @@ -70,7 +88,7 @@ namespace PepperDash.Essentials.Core } else { - Debug.Console(2, "File {0} Does not exsist", file.FullName); + Debug.Console(2, "File {0} does not exsist", file.FullName); return ""; } @@ -127,9 +145,9 @@ namespace PepperDash.Essentials.Core public static bool FileIoUnitTest() { var testData = "Testing FileIO"; - FileIO.WriteDataToFile(testData, "\\USER\\FileIOTest.pdt"); + FileIO.WriteDataToFile(testData, "\\user\\FileIOTest.pdt"); - var file = FileIO.GetFile("\\USER\\*FileIOTest*"); + var file = FileIO.GetFile("\\user\\*FileIOTest*"); var readData = FileIO.GetDataFromFile(file); Debug.Console(0, "Returned {0}", readData); From 7e8d88c3af3592af9bdcba83e06da5b8d2d2d1f6 Mon Sep 17 00:00:00 2001 From: Jason Alborough Date: Mon, 21 Mar 2022 18:32:34 -0400 Subject: [PATCH 4/6] fix: fix method name in test --- .../Essentials Core/PepperDashEssentialsBase/File/FileIO.cs | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/essentials-framework/Essentials Core/PepperDashEssentialsBase/File/FileIO.cs b/essentials-framework/Essentials Core/PepperDashEssentialsBase/File/FileIO.cs index f8bae252..ead03673 100644 --- a/essentials-framework/Essentials Core/PepperDashEssentialsBase/File/FileIO.cs +++ b/essentials-framework/Essentials Core/PepperDashEssentialsBase/File/FileIO.cs @@ -149,7 +149,7 @@ namespace PepperDash.Essentials.Core var file = FileIO.GetFile("\\user\\*FileIOTest*"); - var readData = FileIO.GetDataFromFile(file); + var readData = FileIO.ReadDataFromFile(file); Debug.Console(0, "Returned {0}", readData); File.Delete(file.FullName); if (testData == readData) From 33c7038d99e75a4f292ab2166f7555bd337a02c9 Mon Sep 17 00:00:00 2001 From: Jason Alborough Date: Thu, 24 Mar 2022 17:50:34 -0400 Subject: [PATCH 5/6] feature: write file is now on a low priority thread. feature: add asynchronous read file methods and event --- .../PepperDashEssentialsBase/File/FileIO.cs | 135 ++++++++++++++---- 1 file changed, 110 insertions(+), 25 deletions(-) diff --git a/essentials-framework/Essentials Core/PepperDashEssentialsBase/File/FileIO.cs b/essentials-framework/Essentials Core/PepperDashEssentialsBase/File/FileIO.cs index ead03673..21d9eaec 100644 --- a/essentials-framework/Essentials Core/PepperDashEssentialsBase/File/FileIO.cs +++ b/essentials-framework/Essentials Core/PepperDashEssentialsBase/File/FileIO.cs @@ -5,6 +5,7 @@ using System.Text; using Crestron.SimplSharp; using Crestron.SimplSharp.CrestronIO; using PepperDash.Core; +using Crestron.SimplSharpPro.CrestronThread; namespace PepperDash.Essentials.Core { @@ -12,6 +13,8 @@ namespace PepperDash.Essentials.Core { static CCriticalSection fileLock = new CCriticalSection(); + public delegate void GotFileEventHandler(object sender, FileEventArgs e); + public static event GotFileEventHandler GotFileEvent; /// /// Get the full file info from a path/filename, can include wildcards. @@ -100,42 +103,118 @@ namespace PepperDash.Essentials.Core } } + + public static void ReadDataFromFileASync(string fileName) + { + try + { + ReadDataFromFileASync(GetFile(fileName)); + } + catch (Exception e) + { + Debug.Console(0, Debug.ErrorLogLevel.Error, "Error: FileIO read failed: \r{0}", e); + } + } + + public static void ReadDataFromFileASync(FileInfo file) + { + try + { + CrestronInvoke.BeginInvoke(o => _ReadDataFromFileASync(file)); + } + catch (Exception e) + { + Debug.Console(0, Debug.ErrorLogLevel.Error, "Error: FileIO read failed: \r{0}", e); + } + } + + private static void _ReadDataFromFileASync(FileInfo file) + { + string data; + try + { + DirectoryInfo dirInfo = new DirectoryInfo(file.Name); + Debug.Console(2, "FileIO Getting Data {0}", file.FullName); + + + if (File.Exists(file.FullName)) + { + using (StreamReader r = new StreamReader(file.FullName)) + { + data = r.ReadToEnd(); + } + } + else + { + Debug.Console(2, "File {0} Does not exsist", file.FullName); + data = ""; + } + GotFileEvent.Invoke(null, new FileEventArgs(data)); + + } + catch (Exception e) + { + Debug.Console(0, Debug.ErrorLogLevel.Error, "Error: FileIO read failed: \r{0}", e); + data = ""; + } + + + + } + + /// + /// + /// + /// + /// /// /// /// /// /// public static void WriteDataToFile(string data, string filePath) + { + Thread _WriteFileThread; + _WriteFileThread = new Thread((O) => _WriteFileMethod(data, filePath), null, Thread.eThreadStartOptions.CreateSuspended); + _WriteFileThread.Priority = Thread.eThreadPriority.LowestPriority; + _WriteFileThread.Start(); + Debug.Console(0, Debug.ErrorLogLevel.Notice, "New WriteFile Thread"); + + } + + static object _WriteFileMethod(string data, string filePath) { Debug.Console(0, Debug.ErrorLogLevel.Notice, "Attempting to write file: '{0}'", filePath); - try - { - if (fileLock.TryEnter()) - { - using (StreamWriter sw = new StreamWriter(filePath)) - { - sw.Write(data); - sw.Flush(); - } - - } - else - { - Debug.Console(0, Debug.ErrorLogLevel.Error, "FileIO Unable to enter FileLock"); - } + try + { + if (fileLock.TryEnter()) + { + using (StreamWriter sw = new StreamWriter(filePath)) + { + sw.Write(data); + sw.Flush(); + } - } - catch (Exception e) - { - Debug.Console(0, Debug.ErrorLogLevel.Error, "Error: FileIO write failed: \r{0}", e); - } - finally - { - if (fileLock != null && !fileLock.Disposed) - fileLock.Leave(); + } + else + { + Debug.Console(0, Debug.ErrorLogLevel.Error, "FileIO Unable to enter FileLock"); + } + + } + catch (Exception e) + { + Debug.Console(0, Debug.ErrorLogLevel.Error, "Error: FileIO write failed: \r{0}", e); + } + finally + { + if (fileLock != null && !fileLock.Disposed) + fileLock.Leave(); + + } + return null; - } } /// @@ -163,4 +242,10 @@ namespace PepperDash.Essentials.Core } } + public class FileEventArgs + { + public FileEventArgs(string data) { Data = data; } + public string Data { get; private set; } // readonly + + } } \ No newline at end of file From f902a57f608ebcba7e6c2f8328bf3237933e39af Mon Sep 17 00:00:00 2001 From: Jason Alborough Date: Tue, 19 Apr 2022 15:19:27 -0400 Subject: [PATCH 6/6] feature: add fileLock for reads --- .../PepperDashEssentialsBase/File/FileIO.cs | 61 +++++++++++++------ 1 file changed, 44 insertions(+), 17 deletions(-) diff --git a/essentials-framework/Essentials Core/PepperDashEssentialsBase/File/FileIO.cs b/essentials-framework/Essentials Core/PepperDashEssentialsBase/File/FileIO.cs index 21d9eaec..51d64230 100644 --- a/essentials-framework/Essentials Core/PepperDashEssentialsBase/File/FileIO.cs +++ b/essentials-framework/Essentials Core/PepperDashEssentialsBase/File/FileIO.cs @@ -79,19 +79,27 @@ namespace PepperDash.Essentials.Core { try { - DirectoryInfo dirInfo = new DirectoryInfo(file.Name); - Debug.Console(2, "FileIO Getting Data {0}", file.FullName); - - if (File.Exists(file.FullName)) + if (fileLock.TryEnter()) { - using (StreamReader r = new StreamReader(file.FullName)) + DirectoryInfo dirInfo = new DirectoryInfo(file.Name); + Debug.Console(2, "FileIO Getting Data {0}", file.FullName); + + if (File.Exists(file.FullName)) { - return r.ReadToEnd(); + using (StreamReader r = new StreamReader(file.FullName)) + { + return r.ReadToEnd(); + } + } + else + { + Debug.Console(2, "File {0} does not exsist", file.FullName); + return ""; } } else { - Debug.Console(2, "File {0} does not exsist", file.FullName); + Debug.Console(0, Debug.ErrorLogLevel.Error, "FileIO Unable to enter FileLock"); return ""; } @@ -101,6 +109,12 @@ namespace PepperDash.Essentials.Core Debug.Console(0, Debug.ErrorLogLevel.Error, "Error: FileIO read failed: \r{0}", e); return ""; } + finally + { + if (fileLock != null && !fileLock.Disposed) + fileLock.Leave(); + + } } @@ -133,23 +147,30 @@ namespace PepperDash.Essentials.Core string data; try { - DirectoryInfo dirInfo = new DirectoryInfo(file.Name); - Debug.Console(2, "FileIO Getting Data {0}", file.FullName); - - - if (File.Exists(file.FullName)) + if (fileLock.TryEnter()) { - using (StreamReader r = new StreamReader(file.FullName)) + DirectoryInfo dirInfo = new DirectoryInfo(file.Name); + Debug.Console(2, "FileIO Getting Data {0}", file.FullName); + + + if (File.Exists(file.FullName)) { - data = r.ReadToEnd(); + using (StreamReader r = new StreamReader(file.FullName)) + { + data = r.ReadToEnd(); + } } + else + { + Debug.Console(2, "File {0} Does not exsist", file.FullName); + data = ""; + } + GotFileEvent.Invoke(null, new FileEventArgs(data)); } else { - Debug.Console(2, "File {0} Does not exsist", file.FullName); - data = ""; + Debug.Console(0, Debug.ErrorLogLevel.Error, "FileIO Unable to enter FileLock"); } - GotFileEvent.Invoke(null, new FileEventArgs(data)); } catch (Exception e) @@ -157,6 +178,12 @@ namespace PepperDash.Essentials.Core Debug.Console(0, Debug.ErrorLogLevel.Error, "Error: FileIO read failed: \r{0}", e); data = ""; } + finally + { + if (fileLock != null && !fileLock.Disposed) + fileLock.Leave(); + + }