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)); } } }