UNIVPLMDataIntegration/Admin.NET/Admin.NET.Core/Utils/IO/DirectoryHelper.cs

286 lines
10 KiB
C#
Raw Blame History

This file contains ambiguous Unicode characters

This file contains Unicode characters that might be confused with other characters. If you think that this is intentional, you can safely ignore this warning. Use the Escape button to reveal them.

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