using System.Runtime.InteropServices; namespace StarkSDKSpace { /** * 文件存储接口 * 具体使用说明参考文档:https://bytedance.feishu.cn/docx/JpAMdacnaoyFDdx0fhXcUwL5nAe */ public abstract class StarkFileSystemManager { /// /// 用户数据存储的路径 /// public const string USER_DATA_PATH = "scfile://user"; /// /// 将字符串写入文件(同步) /// /// 要写入的文件路径 /// 要写入的文本 /// 指定写入文件的字符编码 /// 成功返回空字符串,失败返回错误信息 public abstract string WriteFileSync(string filePath, string data, string encoding = "utf8"); /// /// 将二进制写入文件(同步) /// /// 要写入的文件路径 /// 要写入的二进制数据 /// 成功返回空字符串,失败返回错误信息 public abstract string WriteFileSync(string filePath, byte[] data); /// /// 将二进制写入文件(异步) /// /// public abstract void WriteFile(WriteFileParam param); /// /// 将字符串写入文件(异步) /// /// public abstract void WriteFile(WriteFileStringParam param); /// /// 读取本地文件内容(异步) /// /// public abstract void ReadFile(ReadFileParam param); /// /// 从本地文件读取二进制数据数据(同步) /// /// /// 字节数据,读取失败返回null public abstract byte[] ReadFileSync(string filePath); /// /// 从本地文件读取字符串数据(同步) /// /// 要读取的文件的路径 /// 指定读取文件的字符编码, 不能为空 /// 字符串数据,读取失败返回null public abstract string ReadFileSync(string filePath, string encoding); /// /// 判断文件/目录是否存在(同步) /// /// 要判断是否存在的文件/目录路径 /// 成功返回 true, 失败返回 false public abstract bool AccessSync(string path); /// /// 判断文件/目录是否存在(异步) /// /// public abstract void Access(AccessParam param); /// /// 复制文件(同步) /// /// 源文件路径 /// 目标文件路径 /// 成功返回空字符串,失败返回错误信息 public abstract string CopyFileSync(string srcPath, string destPath); /// /// 复制文件(异步) /// /// public abstract void CopyFile(CopyFileParam param); /// /// 重命名文件(异步) /// /// public abstract void RenameFile(RenameFileParam param); /// /// 重命名文件(同步) /// /// 源文件路径 /// 目标文件路径 /// 成功返回空字符串,失败返回错误信息 public abstract string RenameFileSync(string srcPath, string destPath); /// /// 删除文件(同步) /// /// 源文件路径,支持本地路径 /// 成功返回空字符串,失败返回错误信息 public abstract string UnlinkSync(string filePath); /// /// 删除文件(异步) /// /// public abstract void Unlink(UnlinkParam param); /// /// 创建目录(异步) /// /// public abstract void Mkdir(MkdirParam param); /// /// 创建目录(同步) /// /// 创建的目录路径 /// 是否在递归创建该目录的上级目录后再创建该目录。如果对应的上级目录已经存在,则不创建该上级目录。如 dirPath 为 a/b/c/d 且 recursive 为 true,将创建 a 目录,再在 a 目录下创建 b 目录,以此类推直至创建 a/b/c 目录下的 d 目录。 /// 成功返回空字符串,失败返回错误信息 public abstract string MkdirSync(string dirPath, bool recursive = false); /// /// 删除目录(异步) /// /// public abstract void Rmdir(RmdirParam param); /// /// 删除目录(同步) /// /// 创建的目录路径 /// 是否递归删除目录。如果为 true,则删除该目录和该目录下的所有子目录以及文件 。 /// 成功返回空字符串,失败返回错误信息 public abstract string RmdirSync(string dirPath, bool recursive = false); /// /// 读取文件描述信息(同步) /// /// 文件/目录路径 /// 是否递归获取目录下的每个文件的 Stat 信息 /// 是否抛出错误信息,如果抛出错误信息,当文件不存在时则会抛出异常,错误信息从异常中获取。 /// 返回文件信息,如果访问失败则返回null public abstract StarkStatInfo StatSync(string path, bool throwException = false); /// /// 读取文件描述信息(异步) /// /// public abstract void Stat(StatParam param); /// /// 获取保存的用户目录文件列表(仅WebGL平台可用) /// public abstract void GetSavedFileList(GetSavedFileListParam param); /// /// 根据url链接获取本地缓存文件路径(仅WebGL平台可用) /// /// 输入文件下载链接url /// 返回本地缓存文件路径,以scfile://user开头的路径,可以直接用这个路径访问该文件 public abstract string GetLocalCachedPathForUrl(string url); /// /// 判断该url是否有本地缓存文件(仅WebGL平台可用) /// /// 输入文件下载链接url /// 如果存在缓存文件则返回true,不存在缓存文件则返回false public abstract bool IsUrlCached(string url); private static int _isDataMigrated = -1; #if UNITY_WEBGL && !UNITY_EDITOR [DllImport("__Internal")] private static extern bool StarkCanUseLocalStorage(); #else private static bool StarkCanUseLocalStorage() { return false; } #endif #if UNITY_WEBGL && !UNITY_EDITOR [DllImport("__Internal")] private static extern bool StarkIsDataMigrated(); #else private static bool StarkIsDataMigrated() { return false; } #endif #if UNITY_WEBGL && !UNITY_EDITOR [DllImport("__Internal")] private static extern void StarkMigratingData(); #else private static void StarkMigratingData() { } #endif public static bool CanUseLocalStorage() { return StarkCanUseLocalStorage(); } public static bool IsDataMigrated() { if (_isDataMigrated == 1) { return true; } else if (_isDataMigrated == 0) { return false; } var migrated = StarkIsDataMigrated(); _isDataMigrated = migrated ? 1 : 0; return migrated; } public static void MigratingData() { if (!IsDataMigrated()) { StarkMigratingData(); _isDataMigrated = 1; } } } }