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