using System; using System.Collections.Generic; using System.IO; using System.Text; namespace Aki.Launcher.MiniCommon { public static class VFS { public static string Cwd { get; private set; } private static object mutex; static VFS() { Cwd = Environment.CurrentDirectory; mutex = new object(); } /// /// 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 : ""; } /// /// Get file of a filepath /// public static string GetFile(this string filepath) { string value = Path.GetFileName(filepath); return (!string.IsNullOrWhiteSpace(value)) ? value : ""; } /// /// Get file name of a filepath /// public static string GetFileName(this string filepath) { string value = Path.GetFileNameWithoutExtension(filepath); return (!string.IsNullOrWhiteSpace(value)) ? value : ""; } /// /// Get file extension of a filepath. /// public static string GetFileExtension(this string filepath) { string value = Path.GetExtension(filepath); return (!string.IsNullOrWhiteSpace(value)) ? value : ""; } /// /// Move file from one place to another /// public static void MoveFile(string a, string b) { lock (mutex) { new FileInfo(a).MoveTo(b); } } /// /// Does the filepath exist? /// public static bool Exists(string filepath) { lock (mutex) { return Directory.Exists(filepath) || File.Exists(filepath); } } /// /// Create directory (recursive). /// public static void CreateDirectory(string filepath) { lock (mutex) { Directory.CreateDirectory(filepath); } } /// /// Get file content as bytes. /// public static byte[] ReadFile(string filepath) { lock (mutex) { return File.ReadAllBytes(filepath); } } /// /// Get file content as string. /// public static string ReadFile(string filepath, Encoding encoding = null) { return (encoding ?? Encoding.UTF8).GetString(ReadFile(filepath)); } /// /// Write data to file. /// public static void WriteFile(string filepath, byte[] data, bool append = false) { lock (mutex) { if (!Exists(filepath)) { CreateDirectory(filepath.GetDirectory()); } File.WriteAllBytes(filepath, data); } } /// /// Write string to file. /// public static void WriteFile(string filepath, string data, bool append = false, Encoding encoding = null) { WriteFile(filepath, (encoding ?? Encoding.UTF8).GetBytes(data), append); } /// /// Get directories in directory by full path. /// public static string[] GetDirectories(string filepath) { lock (mutex) { 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) { lock (mutex) { 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) { lock (mutex) { 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) { lock (mutex) { FileInfo file = new FileInfo(filepath); file.IsReadOnly = false; file.Delete(); } } /// /// Get files count inside directory recusively /// public static int GetFilesCount(string filepath) { lock (mutex) { DirectoryInfo di = new DirectoryInfo(filepath); int count = 0; foreach (FileInfo file in di.GetFiles()) { ++count; } foreach (DirectoryInfo directory in di.GetDirectories()) { count += GetFilesCount(directory.FullName); } return count; } } } }