using Microsoft.AspNetCore.Hosting; using System; using System.Collections.Generic; using System.IO; using System.Linq; using System.Threading.Tasks; using TTSW.Constant; using MimeTypes; using System.Net.Http; using Newtonsoft.Json; using Microsoft.Extensions.Configuration; namespace TTSW.Utils { public static class FileUtil { public static IConfiguration Configuration { get; set; } #region Serialize File public static string GetRootPath() { return Directory.GetCurrentDirectory(); } public static void Serialize(string serializeFilePath, object input) { using (StreamWriter file = System.IO.File.CreateText(serializeFilePath)) { JsonSerializer serializer = new JsonSerializer(); serializer.Converters.Add(new FileInfoJsonConverter()); serializer.Converters.Add(new DirectoryInfoJsonConverter()); serializer.Serialize(file, input); } } 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)); } } public static StaticConfigModel GetStaticConfig() { StaticConfigModel s = new StaticConfigModel(); string logfile = Configuration["Files:LogFile"]; string rootpath = Configuration["Directories:RootPath"]; string logs = Configuration["Directories:Logs"]; string files = Configuration["Directories:Files"]; if (!Directory.Exists(rootpath)) Directory.CreateDirectory(rootpath); if (!Directory.Exists(logs)) Directory.CreateDirectory(logs); if (!Directory.Exists(files)) Directory.CreateDirectory(files); if (!File.Exists(logfile)) File.CreateText(logfile); s.Files = new Dictionary(); s.Directories = new Dictionary(); s.Files.Add("LogFile", new FileInfo(logfile)); s.Directories.Add("RootPath", new DirectoryInfo(rootpath)); s.Directories.Add("Logs", new DirectoryInfo(logs)); s.Directories.Add("Files", new DirectoryInfo(files)); return s; } /// /// Steps /// 1. Revise Utils\Models\StaticConfigModel.cs to add more properties /// 2. Edit code in this function on StaticConfigModel to declare more properties /// 3. Update the config file with by running this function to serialize it again /// // public static void UpdateConfigFile() // { // var configFilePath = FileUtil.GetStaticConfigFilePath(); // // Declare file info // var fileInfo = new StaticConfigModel(); //fileInfo.Files = new System.Collections.Generic.Dictionary(); //fileInfo.Directories = new System.Collections.Generic.Dictionary(); //fileInfo.Files.Add("appsetting", new FileInfo("./appsetting.json")); //fileInfo.Files.Add("temp", new FileInfo("./tmp.json")); //fileInfo.Directories.Add("images", new DirectoryInfo("./images")); //fileInfo.Directories.Add("pdf", new DirectoryInfo("./pdf")); // // Serialize file info to config file // FileUtil.Serialize(configFilePath, fileInfo); // // Test getting content int the file // var resultConfig = FileUtil.Deserialize(configFilePath); // } #endregion public static string GetLogPath() { var staticConfig = GetStaticConfig(); return staticConfig.Directories["Logs"].FullName; } /// /// Get root path /// /// /// public static string GetAbsolutePath(string filePath) { var staticConfig = GetStaticConfig(); var currentDir = staticConfig.Directories["RootPath"]; return Path.Combine(currentDir.FullName, filePath); } /// /// Get root path for the specific dir /// /// /// public static FilePathInfo GetDirectoryRootPath(FilePathConstant.DirType dir) { var dirName = StringEnumUtil.GetStringValue(dir); var filePathInfo = new FilePathInfo() { RelativePath = dirName, PhysicalPath = FileUtil.GetAbsolutePath(dirName) }; if (!Directory.Exists(filePathInfo.PhysicalPath)) Directory.CreateDirectory(filePathInfo.PhysicalPath); return filePathInfo; } /// /// Get both relative and physical dir path in format {root dir}/{id}/ /// /// /// /// public static FilePathInfo GetDirectoryInfo(FilePathConstant.DirType dirType, object id) { var rootPath = GetDirectoryRootPath(dirType); var info = new FilePathInfo() { PhysicalPath = Path.Combine(rootPath.PhysicalPath, id.ToString()), RelativePath = Path.Combine(rootPath.RelativePath, id.ToString()) }; if (!Directory.Exists(info.PhysicalPath)) Directory.CreateDirectory(info.PhysicalPath); return info; } /// /// Get both relative and physical file path in format {root dir}/{id}/{temp filename} /// /// /// /// /// public static FilePathInfo GetFileInfo(FilePathConstant.DirType dirType, object id, string fileName) { var dirInfo = GetDirectoryInfo(dirType, id); var info = new FilePathInfo() { PhysicalPath = Path.Combine(dirInfo.PhysicalPath, fileName), RelativePath = Path.Combine(dirInfo.RelativePath, fileName) }; return info; } /// /// Get temporary path for file uploading /// /// public static FilePathInfo GetTempUploadPath() { // Create temp id for temp dir var tempId = Guid.NewGuid(); var tempDirInfo = GetDirectoryInfo(FilePathConstant.DirType.TempUpload, tempId); if (!Directory.Exists(tempDirInfo.PhysicalPath)) Directory.CreateDirectory(tempDirInfo.PhysicalPath); return tempDirInfo; } /// /// Move file to specific folder in the format {root dir}/{id}/{temp filename} /// /// Null is no file moved. Else return filename public static string MoveTempUploadFileToActualPath(string tempRelativeFilePath, FilePathConstant.DirType dirType, object id) { string fileName = ""; var tempFilePath = FileUtil.GetAbsolutePath(tempRelativeFilePath); // If the temp file does not exist, exit the function. if (File.Exists(tempFilePath)) { fileName = Path.GetFileName(tempFilePath); var newFileInfo = GetFileInfo(dirType, id, fileName); if (File.Exists(newFileInfo.PhysicalPath) && new FileInfo(tempFilePath).FullName != new FileInfo(newFileInfo.PhysicalPath).FullName) File.Delete(newFileInfo.PhysicalPath); File.Move(tempFilePath, newFileInfo.PhysicalPath); return fileName; } return fileName; } /// /// Move file to specific folder in the format {root dir}/{id}/{temp filename}. It also remove old specific file. /// /// Null is no file moved. Else return filename public static string MoveTempUploadFileToActualPath(string tempRelativeFilePath, FilePathConstant.DirType dirType, object id, string oldFileName) { //Remove old file first if (!string.IsNullOrEmpty(oldFileName)) { var oldFileInfo = GetFileInfo(dirType, id, oldFileName); if (File.Exists(oldFileInfo.PhysicalPath)) File.Delete(oldFileInfo.PhysicalPath); } return MoveTempUploadFileToActualPath(tempRelativeFilePath, dirType, id); } /// /// Move file to specific folder in the format {root dir}/{id}/{temp filename}. It also remove old specific file. /// /// Null is no file moved. Else return filename public static FileBase64Info MoveTempUploadFileToBase64File(string tempRelativeFilePath) { var tempFilePath = FileUtil.GetAbsolutePath(tempRelativeFilePath); // If the temp file does not exist, exit the function. if (File.Exists(tempFilePath)) { var fileName = Path.GetFileName(tempFilePath); var fileExtension = Path.GetExtension(tempFilePath); var base64Info = new FileBase64Info(); // Get mine type to use later to produce data url base64Info.FileName = fileName; base64Info.MimeType = MimeTypeMap.GetMimeType(fileExtension); // Convert file content to base64 string Byte[] bytes = File.ReadAllBytes(tempFilePath); base64Info.Content = Convert.ToBase64String(bytes); //Delete the file from temp //File.Delete(tempFilePath); return base64Info; } else return null; } public static bool AreThereAnyFilesInDirectory(string directoryPath) { if (!Directory.Exists(directoryPath)) return false; var files = Directory.GetFiles(directoryPath); return (files.Count() > 0) ? true : false; } public static void DeleteAllFilesInDirectory(string directoryPath) { if (!Directory.Exists(directoryPath)) return; DirectoryInfo dirInfo = new DirectoryInfo(directoryPath); var files = dirInfo.GetFiles(); foreach (var file in files) file.Delete(); return; } public static void DeleteAllFilesInDirectory(FilePathConstant.DirType dirType, Guid id) { var dirInfo = GetDirectoryInfo(dirType, id); DeleteAllFilesInDirectory(dirInfo.PhysicalPath); } /// /// Get data url with base64 content in format data:{mineType};base64,{content} /// /// /// /// public static FileBase64Info GetBase64Info(string content, string mineType) { return new FileBase64Info() { Content = content, MimeType = mineType }; } // Get file stream content public static StreamContent GetFileStream(string filePath) { var fullPath = GetAbsolutePath(filePath); var filestream = File.Open(fullPath, FileMode.Open, FileAccess.Read); return new StreamContent(filestream); } public static string GetFileName(string filePath) { return Path.GetFileName(filePath); } public static bool DoesFileExist(string fullPath) { if (File.Exists(fullPath)) return true; else return false; } public static string GetMineType(string fullPath) { var fileExtension = Path.GetExtension(fullPath); return MimeTypeMap.GetMimeType(fileExtension); } } }