using System.IO; using Xamarin.Essentials; namespace System { /// /// [文件夹(Dir)]、[文件(File)]的[路径/目录(Path)]相关的工具类 /// public static class IOPath { #region 文件夹(Dir) /// /// 如果指定的[文件夹(Dir)]目录不存在,则创建[文件夹(Dir)]目录 /// /// public static void DirCreateByNotExists(string dirPath) { if (!Directory.Exists(dirPath)) Directory.CreateDirectory(dirPath); } /// public static void CreateByNotExists(this DirectoryInfo dirInfo) { if (!dirInfo.Exists) dirInfo.Create(); } /// /// 尝试删除指定的[文件夹(Dir)]路径,默认将删除文件夹下的所有文件、子目录 /// 通常用于删除缓存 /// /// /// public static void DirTryDelete(string dirPath, bool noRecursive = false) { try { Directory.Delete(dirPath, !noRecursive); } catch { } } #endregion #region 文件(File) /// /// 如果指定的[文件(File)]路径存在,则删除 /// 可选择是否检查所在[文件夹(Dir)]路径是否存在,不存在则创建[文件夹(Dir)] /// /// /// public static void FileIfExistsItDelete(string filePath, bool notCreateDir = false) { if (File.Exists(filePath)) { File.Delete(filePath); } else if (!notCreateDir) { DirCreateByNotExists(Path.GetDirectoryName(filePath)); } } /// public static void IfExistsItDelete(this FileInfo fileInfo, bool notCreateDir = false) { if (fileInfo.Exists) { fileInfo.Delete(); } else if (!notCreateDir) { DirCreateByNotExists(Path.GetDirectoryName(fileInfo.FullName)); } } /// /// 尝试删除指定的[文件(File)]路径 /// 通常用于删除缓存 /// /// public static void FileTryDelete(string filePath) { try { File.Delete(filePath); } catch { } } #endregion #region FileSystem static Func? getAppDataDirectory; static Func? getCacheDirectory; /// public static string AppDataDirectory { get { if (getAppDataDirectory != null) return getAppDataDirectory(); return FileSystem.AppDataDirectory; } } /// public static string CacheDirectory { get { if (getCacheDirectory != null) return getCacheDirectory(); return FileSystem.CacheDirectory; } } /// /// (可选)初始化文件系统 /// 通常在 Xamarin.Essentials 不支持的平台上,为必选项 /// /// 获取应用目录文件夹 /// 获取缓存目录文件夹 public static void InitFileSystem(Func getAppDataDirectory, Func getCacheDirectory) { IOPath.getAppDataDirectory = getAppDataDirectory; IOPath.getCacheDirectory = getCacheDirectory; } #endregion /// /// 获取[文件(File)]资源路径 /// /// 资源数据 /// 资源名称 /// 资源文件版本 /// 资源文件扩展名 /// public static string GetFileResourcePath(byte[] resData, string resName, int resVer, string fileEx) { var dirPath = Path.Combine(AppDataDirectory, resName); var filePath = Path.Combine(dirPath, $"{resName}@{resVer}{fileEx}"); if (!Directory.Exists(dirPath)) { Directory.CreateDirectory(dirPath); WriteFile(); } else { if (!File.Exists(filePath)) { var oldFiles = Directory.GetFiles(dirPath); if (oldFiles != null) { foreach (var oldFile in oldFiles) { FileTryDelete(oldFile); } } WriteFile(); } } void WriteFile() => File.WriteAllBytes(filePath, resData); return filePath; } /// /// 判断路径是否为[文件夹(Dir)] /// /// /// public static bool IsDirectory(string ioPath) { var attr = File.GetAttributes(ioPath); return attr.HasFlag(FileAttributes.Directory); } /// /// 获取[文件夹(Dir)]路径 /// 如果传入的参数为[文件(File)]路径,则返回当前所在[文件夹(Dir)]路径 /// 如果传入的参数为[文件夹(Dir)]路径,则直接返回参数 /// /// /// public static string GetDirectoryPath(string ioPath) { try { if (!IsDirectory(ioPath)) { return Path.GetDirectoryName(ioPath) ?? string.Empty; } } catch { } return ioPath; } } }