// 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 目录检查
}