namespace MeloongCore;
public static class DirectoryUtils {
///
/// 创建文件夹,或文件所在的文件夹。
/// 文件夹已存在时不会抛出异常。
///
public static void Create(string path, bool isFilePath = false) {
if (isFilePath) path = Path.GetDirectoryName(path);
if (Exists(path)) return;
Logger.Trace($"新建文件夹:{path}");
path = PathUtils.WithLongPath(path);
Directory.CreateDirectory(path);
}
///
/// 判断文件夹是否存在。
///
public static bool Exists(string path) {
return Directory.Exists(PathUtils.WithLongPath(path));
}
///
/// 创建 对象。
///
public static DirectoryInfo GetInfo(string path) {
return new(PathUtils.WithLongPath(path));
}
///
/// 返回指定路径下的所有文件,不以 \\?\ 开头。
///
public static IEnumerable GetFiles(string path, bool topDirectoryOnly = false, string searchPattern = "*") {
if (!Exists(path)) return [];
Logger.Trace($"枚举文件({searchPattern},递归:{!topDirectoryOnly}):{path}");
return Directory.EnumerateFiles(PathUtils.WithLongPath(path), searchPattern, topDirectoryOnly ? SearchOption.TopDirectoryOnly : SearchOption.AllDirectories).
Select(PathUtils.WithoutLongPath);
}
///
/// 返回指定路径下的所有文件夹,不以分隔符结尾,不以 \\?\ 开头。
///
public static IEnumerable GetDirectories(string path, bool topDirectoryOnly = false, string searchPattern = "*") {
if (!Exists(path)) return [];
Logger.Trace($"枚举文件夹({searchPattern},递归:{!topDirectoryOnly}):{path}");
return Directory.EnumerateDirectories(PathUtils.WithLongPath(path), searchPattern, topDirectoryOnly ? SearchOption.TopDirectoryOnly : SearchOption.AllDirectories).
Select(PathUtils.WithoutLongPath);
}
///
/// 该文件夹是否为空。
/// 如果文件夹不存在,也返回 true。
///
public static bool IsEmpty(string path) {
if (!Exists(path)) return true;
return !Directory.EnumerateFileSystemEntries(PathUtils.WithLongPath(path)).Any();
}
///
/// 剪切文件夹。
///
public static void Move(string sourceDirName, string destDirName) {
if (!Exists(sourceDirName)) return;
Create(destDirName);
Logger.Trace($"剪切文件夹:{sourceDirName} → {destDirName}");
Directory.Move(PathUtils.WithLongPath(sourceDirName), PathUtils.WithLongPath(destDirName));
}
///
/// 删除文件夹。
///
public static void Delete(string dirPath, bool toRecycleBin = false) {
if (!Exists(dirPath)) return;
Logger.Trace($"{(toRecycleBin ? "将文件夹删除到回收站" : "删除文件夹")}:{dirPath}");
if (toRecycleBin) {
FileUtils.DeleteToRecycleBin(dirPath);
} else {
Directory.Delete(PathUtils.WithLongPath(dirPath));
}
}
}