using System; using System.Collections.Generic; using System.IO; using System.Linq; using System.Threading.Tasks; using Newtonsoft.Json; namespace TTSW.Utils { /// /// Sigleton class to manage folder with configuration file. /// /// /// Configuration (AppIOConfiguration.json) can be created in advance also be able to create in runtime too. /// public sealed class AppIOConfiguration { #region Properties and internal classes public class FilePathInfo { public string RelativePath { get; set; } public FileInfo File { get; set; } } public class DirectoryPathInfo { public string RelativePath {get;set;} public DirectoryInfo Directory { get; set; } } public Dictionary Files { get; } = new Dictionary(); public Dictionary Directories { get; } = new Dictionary(); #endregion #region Private Member for Singleton and instantiate private static readonly Lazy lazy = new Lazy(PopulateObject); private const string StaticConfigFileName = @"AppIOConfiguration.json"; public static AppIOConfiguration Instance => lazy.Value; private static string configurationFile => Path.Combine(Directory.GetCurrentDirectory(), StaticConfigFileName); private static string currentDirectory => Directory.GetCurrentDirectory(); private AppIOConfiguration(){ } private AppIOConfiguration(Dictionary Files, Dictionary Directories) { this.Directories = Directories; this.Files = Files; } private static AppIOConfiguration PopulateObject() { if (File.Exists(configurationFile)) { using (StreamReader file = System.IO.File.OpenText(configurationFile)) { JsonSerializer serializer = new JsonSerializer(); serializer.Converters.Add(new FileInfoJsonConverter()); serializer.Converters.Add(new DirectoryInfoJsonConverter()); return (AppIOConfiguration)serializer.Deserialize(file, typeof(AppIOConfiguration)); } } else { return new AppIOConfiguration(); } } #endregion public static void Serialize(string serializeFilePath, T input) { using (StreamWriter file = System.IO.File.CreateText(serializeFilePath)) { JsonSerializer serializer = new JsonSerializer(); serializer.Converters.Add(new FileInfoJsonConverter()); serializer.Converters.Add(new DirectoryInfoJsonConverter()); serializer.Formatting = Formatting.Indented; serializer.Serialize(file, input, typeof(T)); } } public static T Deserialize(string serializeFilePath) { using (StreamReader file = System.IO.File.OpenText(serializeFilePath)) { JsonSerializer serializer = new JsonSerializer(); serializer.Converters.Add(new FileInfoJsonConverter()); serializer.Converters.Add(new DirectoryInfoJsonConverter()); return (T)serializer.Deserialize(file, typeof(T)); } } private static void Save() { Serialize(configurationFile, Instance); } /// /// Create Directory and save to configuration file /// /// Use as a Key in Directories collection /// Reference to parent directory referred by Key in Directories collection.(default value is "RootPath") /// Alias(fake) path. If value is empty, value will be assigned by combining parent.RelativePath + directoryName /// /// This is an example for using this method. /// /// AppIOConfiguration.CreateDirectory("Files"); /// AppIOConfiguration.CreateDirectory("Logs", relativePath:"/logs"); /// AppIOConfiguration.CreateDirectory("Log2018", "Logs", "/logs2018"); /// AppIOConfiguration.CreateDirectory("EIC_OrderList", "Files"); /// /// public static void CreateDirectory(string directoryName, string parentKeyName = "RootPath", string relativePath = "") { if (parentKeyName.Equals("RootPath") && !Instance.Directories.ContainsKey(parentKeyName)) { var appRootDirectory = new DirectoryInfo(currentDirectory); var appRootDirectoryPathInfo = new DirectoryPathInfo() { Directory = appRootDirectory, RelativePath = "/" }; Instance.Directories.Add("RootPath", appRootDirectoryPathInfo); Save(); } if (!Instance.Directories.ContainsKey(parentKeyName)) { throw new DirectoryNotFoundException("Parent's keyname is not found"); } if (!Instance.Directories.ContainsKey(directoryName)) { var parentDirectory = Instance.Directories[parentKeyName]; var parentPath = parentDirectory.Directory.FullName; var createdDirectory = new DirectoryInfo(Path.Combine(parentPath, directoryName)); createdDirectory.Create(); var createdDirectoryPathInfo = new DirectoryPathInfo() { Directory = createdDirectory, }; createdDirectoryPathInfo.RelativePath = string.IsNullOrEmpty(relativePath) ? Path.Combine(parentDirectory.RelativePath, directoryName) : relativePath; if (!createdDirectory.Exists) { createdDirectory.Create(); } Instance.Directories.Add(directoryName, createdDirectoryPathInfo); Save(); } } } }