using System; using System.Collections.Generic; using System.IO; using System.Threading.Tasks; namespace SPT.Common.Utils { public static class VFS { public static string Cwd { get; private set; } static VFS() { Cwd = Environment.CurrentDirectory; } /// /// Combine two filepaths. /// public static string Combine(string path1, string path2) { return Path.Combine(path1, path2); } /// /// Combines the filepath with the current working directory. /// public static string FromCwd(this string filepath) { return Combine(Cwd, filepath); } /// /// Get directory path of a filepath. /// public static string GetDirectory(this string filepath) { string value = Path.GetDirectoryName(filepath); return (!string.IsNullOrWhiteSpace(value)) ? value : string.Empty; } /// /// Get file of a filepath /// public static string GetFile(this string filepath) { string value = Path.GetFileName(filepath); return (!string.IsNullOrWhiteSpace(value)) ? value : string.Empty; } /// /// Get file name of a filepath /// public static string GetFileName(this string filepath) { string value = Path.GetFileNameWithoutExtension(filepath); return (!string.IsNullOrWhiteSpace(value)) ? value : string.Empty; } /// /// Get file extension of a filepath. /// public static string GetFileExtension(this string filepath) { string value = Path.GetExtension(filepath); return (!string.IsNullOrWhiteSpace(value)) ? value : string.Empty; } /// /// Move file from one place to another /// public static void MoveFile(string a, string b) { new FileInfo(a).MoveTo(b); } /// /// Does the filepath exist? /// public static bool Exists(string filepath) { return Directory.Exists(filepath) || File.Exists(filepath); } /// /// Create directory (recursive). /// public static void CreateDirectory(string filepath) { Directory.CreateDirectory(filepath); } /// /// Get file content as bytes. /// public static byte[] ReadFile(string filepath) { return File.ReadAllBytes(filepath); } /// /// Get file content as bytes. /// public static async Task ReadFileAsync(string filepath) { byte[] result; using (var fs = File.Open(filepath, FileMode.Open)) { result = new byte[fs.Length]; await fs.ReadAsync(result, 0, (int)fs.Length); } return result; } /// /// Get file content as string. /// public static string ReadTextFile(string filepath) { return File.ReadAllText(filepath); } /// /// Get file content as string. /// public static async Task ReadTextFileAsync(string filepath) { using (var fs = File.Open(filepath, FileMode.Open)) { using (var sr = new StreamReader(fs)) { return await sr.ReadToEndAsync(); } } } /// /// Write data to file. /// public static void WriteFile(string filepath, byte[] data) { if (!Exists(filepath)) { CreateDirectory(filepath.GetDirectory()); } File.WriteAllBytes(filepath, data); } /// /// Write data to file. /// public static async Task WriteFileAsync(string filepath, byte[] data) { if (!Exists(filepath)) { CreateDirectory(filepath.GetDirectory()); } using (FileStream stream = File.Open(filepath, FileMode.OpenOrCreate, FileAccess.Write)) { await stream.WriteAsync(data, 0, data.Length); } } /// /// Write string to file. /// public static void WriteTextFile(string filepath, string data, bool append = false) { if (!Exists(filepath)) { CreateDirectory(filepath.GetDirectory()); } if (append) { File.AppendAllText(filepath, data); } else { File.WriteAllText(filepath, data); } } /// /// Get directories in directory by full path. /// public static string[] GetDirectories(string filepath) { DirectoryInfo di = new DirectoryInfo(filepath); List paths = new List(); foreach (DirectoryInfo directory in di.GetDirectories()) { paths.Add(directory.FullName); } return paths.ToArray(); } /// /// Get files in directory by full path. /// public static string[] GetFiles(string filepath) { DirectoryInfo di = new DirectoryInfo(filepath); List paths = new List(); foreach (FileInfo file in di.GetFiles()) { paths.Add(file.FullName); } return paths.ToArray(); } /// /// Delete directory. /// public static void DeleteDirectory(string filepath) { DirectoryInfo di = new DirectoryInfo(filepath); foreach (FileInfo file in di.GetFiles()) { file.IsReadOnly = false; file.Delete(); } foreach (DirectoryInfo directory in di.GetDirectories()) { DeleteDirectory(directory.FullName); } di.Delete(); } /// /// Delete file. /// public static void DeleteFile(string filepath) { FileInfo file = new FileInfo(filepath); file.IsReadOnly = false; file.Delete(); } /// /// Get files count inside directory recursively /// public static int GetFilesCount(string filepath) { DirectoryInfo di = new DirectoryInfo(filepath); return di.Exists ? di.GetFiles("*.*", SearchOption.AllDirectories).Length : -1; } } }