using System.IO;
using System.Text;
using UnityEngine;
namespace AlicizaX
{
public static partial class Utility
{
///
/// 路径相关的实用函数。
///
public static class Path
{
private static readonly StringBuilder CombineStringBuilder = new StringBuilder();
///
/// 应用程序外部资源路径存放路径(热更新资源路径)。
///
public static string AppHotfixResPath
{
get
{
string game = Application.productName;
return $"{Application.persistentDataPath}/{game}/";
}
}
///
/// 应用程序内部资源路径存放路径。
///
public static string AppResPath => GetRegularPath(Application.streamingAssetsPath);
///
/// 应用程序内部资源路径存放路径(www/webrequest专用)。
///
public static string AppResPath4Web
{
get
{
#if UNITY_IOS || UNITY_STANDALONE_OSX || UNITY_STANDALONE_WIN || UNITY_EDITOR
return $"file://{Application.streamingAssetsPath}";
#else
return GetRegularPath(Application.streamingAssetsPath);
#endif
}
}
///
/// 获取平台名称。
///
public static string PlatformName
{
get
{
#if UNITY_ANDROID
return "Android";
#elif UNITY_STANDALONE_OSX
return "MacOs";
#elif UNITY_IOS || UNITY_IPHONE
return "iOS";
#elif UNITY_WEBGL
return "WebGL";
#elif UNITY_STANDALONE_WIN
return "Windows";
#else
return string.Empty;
#endif
}
}
///
/// 获取规范的路径。
///
/// 要规范的路径。
/// 规范的路径。
public static string GetRegularPath(string path)
{
if (path == null)
{
return null;
}
return path.Replace('\\', '/');
}
///
/// 获取规范的路径。
///
/// 要规范的路径。
/// 规范的路径。
public static string NormalizePath(string path)
{
return GetRegularPath(path);
}
///
/// 获取远程格式的路径(带有file:// 或 http:// 前缀)。
///
/// 原始路径。
/// 远程格式路径。
public static string GetRemotePath(string path)
{
string regularPath = GetRegularPath(path);
if (regularPath == null)
{
return null;
}
return regularPath.Contains("://") ? regularPath : ("file:///" + regularPath).Replace("file:////", "file:///");
}
///
/// 拼接路径。
///
public static string Combine(params string[] paths)
{
if (paths == null || paths.Length == 0)
{
return string.Empty;
}
CombineStringBuilder.Clear();
for (int index = 0; index < paths.Length - 1; index++)
{
string path = paths[index];
if (string.IsNullOrEmpty(path))
{
continue;
}
CombineStringBuilder.Append(path);
char lastChar = path[path.Length - 1];
if (lastChar != '/' && lastChar != '\\')
{
CombineStringBuilder.Append('/');
}
}
CombineStringBuilder.Append(paths[paths.Length - 1]);
return CombineStringBuilder.ToString();
}
///
/// 移除空文件夹。
///
/// 要处理的文件夹名称。
/// 是否移除空文件夹成功。
public static bool RemoveEmptyDirectory(string directoryName)
{
if (string.IsNullOrEmpty(directoryName))
{
throw new GameFrameworkException("Directory name is invalid.");
}
try
{
if (!Directory.Exists(directoryName))
{
return false;
}
// 不使用 SearchOption.AllDirectories,以便于在可能产生异常的环境下删除尽可能多的目录
string[] subDirectoryNames = Directory.GetDirectories(directoryName, "*");
int subDirectoryCount = subDirectoryNames.Length;
foreach (string subDirectoryName in subDirectoryNames)
{
if (RemoveEmptyDirectory(subDirectoryName))
{
subDirectoryCount--;
}
}
if (subDirectoryCount > 0)
{
return false;
}
if (Directory.GetFiles(directoryName, "*").Length > 0)
{
return false;
}
Directory.Delete(directoryName);
return true;
}
catch
{
return false;
}
}
}
}
}