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