// Admin.NET 项目的版权、商标、专利和其他相关权利均受相应法律法规的保护。使用本项目应遵守相关法律法规和许可证的要求。 // // 本项目主要遵循 MIT 许可证和 Apache 许可证(版本 2.0)进行分发和使用。许可证位于源代码树根目录中的 LICENSE-MIT 和 LICENSE-APACHE 文件。 // // 不得利用本项目从事危害国家安全、扰乱社会秩序、侵犯他人合法权益等法律法规禁止的活动!任何基于本项目二次开发而产生的一切法律纠纷和责任,我们不承担任何责任! namespace Admin.NET.Core; /// /// 目录帮助类 /// public static class DirectoryHelper { #region 目录操作 /// /// 创建一个新目录,如果目录已存在则不执行任何操作 /// /// 要创建的目录的路径 public static void CreateIfNotExists(string directoryPath) { if (!Directory.Exists(directoryPath)) { _ = Directory.CreateDirectory(directoryPath); } } /// /// 删除一个目录,如果目录存在 /// /// 要删除的目录的路径 public static void DeleteIfExists(string directoryPath) { if (Directory.Exists(directoryPath)) { // true 表示删除目录及其所有子目录和文件 Directory.Delete(directoryPath, true); } } /// /// 清空一个目录,不删除目录本身,只删除其中的所有文件和子目录 /// /// 要清空的目录的路径 public static void Clear(string directoryPath) { foreach (var file in Directory.GetFiles(directoryPath)) { File.Delete(file); } foreach (var dir in Directory.GetDirectories(directoryPath)) { DeleteIfExists(dir); } } /// /// 移动目录到另一个位置 /// /// 当前目录的路径 /// 目标目录的路径 public static void Move(string sourcePath, string destinationPath) { Directory.Move(sourcePath, destinationPath); } /// /// 复制一个目录到另一个位置 /// /// 当前目录的路径 /// 目标目录的路径 /// 如果目标位置已经存在同名目录,是否覆盖 public static void Copy(string sourcePath, string destinationPath, bool overwrite = false) { try { // 检查目标目录是否存在,如果存在且 overwrite 为 false,则不执行复制 if (Directory.Exists(destinationPath) && !overwrite) { throw new IOException("目标目录已存在且 overwrite 参数为 false "); } // 复制目录 DirectoryInfo sourceDir = new(sourcePath); if (!Directory.Exists(destinationPath)) { _ = Directory.CreateDirectory(destinationPath); } var files = sourceDir.GetFiles(); foreach (var file in files) { _ = file.CopyTo(Path.Combine(destinationPath, file.Name), overwrite); } var dirs = sourceDir.GetDirectories(); foreach (var dir in dirs) { var newDirPath = Path.Combine(destinationPath, dir.Name); Copy(dir.FullName, newDirPath, overwrite); } } catch (Exception ex) { throw new Exception("复制目录出错", ex); } } #endregion 目录操作 #region 目录信息 /// /// 获取当前目录中所有文件的路径 /// /// 目录的路径 /// 包含目录中文件路径的数组 public static string[] GetFiles(string directoryPath) { return Directory.GetFiles(directoryPath); } /// /// 获取目录中所有文件的路径 /// /// 目录的路径 /// 模式字符串,"*"代表0或 N 个字符,"?"代表1个字符 范例:"Log*.xml"表示搜索所有以 Log 开头的 Xml 文件 /// 是否搜索子目录 /// 包含目录中所有文件路径的数组 public static string[] GetFiles(string directoryPath, string searchPattern, bool isSearchChild) { return Directory.GetFiles(directoryPath, searchPattern, isSearchChild ? SearchOption.AllDirectories : SearchOption.TopDirectoryOnly); } /// /// 获取当前目录中所有子目录的路径 /// /// 目录的路径 /// 包含目录中所有子目录路径的数组 public static string[] GetDirectories(string directoryPath) { return Directory.GetDirectories(directoryPath); } /// /// 获取指定目录及子目录中所有子目录列表 /// /// 指定目录的绝对路径 /// 模式字符串,"*"代表0或 N 个字符,"?"代表1个字符 范例:"Log*.xml"表示搜索所有以 Log 开头的 Xml 目录 /// 是否搜索子目录 /// 包含目录中所有文件路径的数组 public static string[] GetDirectories(string directoryPath, string searchPattern, bool isSearchChild) { return Directory.GetDirectories(directoryPath, searchPattern, isSearchChild ? SearchOption.AllDirectories : SearchOption.TopDirectoryOnly); } /// /// 获取指定目录大小 /// /// /// /// public static long GetSize(string dirPath) { // 定义一个 DirectoryInfo 对象 DirectoryInfo di = new(dirPath); // 通过 GetFiles 方法,获取 di 目录中的所有文件的大小 var len = di.GetFiles().Sum(fi => fi.Length); // 获取 di 中所有的文件夹,并存到一个新的对象数组中,以进行递归 var dis = di.GetDirectories(); if (dis.Length <= 0) { return len; } len += dis.Sum(t => GetSize(t.FullName)); return len; } /// /// 获取随机文件名 /// /// public static string GetRandomName() { return Path.GetRandomFileName(); } /// /// 根据时间得到文件名 /// yyyyMMddHHmmssfff /// /// public static string GetDateName() { return DateTime.Now.ToString("yyyyMMddHHmmssfff"); } #endregion 目录信息 #region 目录检查 /// /// 检查给定路径是否为目录 /// /// 要检查的路径 /// true 如果路径是一个目录,否则 false public static bool Exists(string path) { return Directory.Exists(path); } /// /// 检测指定目录中是否存在指定的文件(搜索子目录) /// /// 指定目录的绝对路径 /// 模式字符串,"*"代表0或 N 个字符,"?"代表1个字符 范例:"Log*.xml"表示搜索所有以 Log 开头的 Xml 文件 /// 是否搜索子目录 /// /// public static bool IsContainsFiles(string directoryPath, string searchPattern, bool isSearchChild) { // 获取指定的文件列表 var fileNames = GetFiles(directoryPath, searchPattern, isSearchChild); // 判断指定文件是否存在 return fileNames.Length != 0; } /// /// 检测指定目录是否为空 /// /// 指定目录的绝对路径 /// public static bool IsEmpty(string directoryPath) { // 判断是否存在文件 var fileNames = GetFiles(directoryPath); if (fileNames.Length != 0) { return false; } // 判断是否存在文件夹 var directoryNames = GetDirectories(directoryPath); return directoryNames.Length == 0; } /// /// 返回应用程序的基目录 /// 程序内部使用的路径,通常是程序所在的文件夹 /// 举例:如果你的程序安装在 C:\MyApp\ 下,那么该属性通常返回 C:\MyApp\ /// /// public static string GetBaseDirectory() { //return AppDomain.CurrentDomain.BaseDirectory; // 在大多数情况下,它和 AppDomain.CurrentDomain.BaseDirectory 是一样的 return AppContext.BaseDirectory; } /// /// 当前进程的工作目录,即程序启动时或运行过程中当前的“活动目录” /// 这个目录可以在程序运行过程中被修改,所以它不一定是程序所在的文件夹 /// 举例:如果你从命令行的 D:\Projects 目录启动了程序,即使程序实际文件在 C:\MyApp\ 下,这个方法返回的就是 D:\Projects /// /// public static string GetCurrentDirectory() { return Directory.GetCurrentDirectory(); } /// /// 返回应用程序的默认静态文件目录 /// 用于存放静态文件,如图片、CSS、JS 等 /// /// public static string GetWwwrootDirectory() { return Path.Combine(GetBaseDirectory(), "wwwroot"); } #endregion 目录检查 }