using System; using System.Collections.Generic; using System.Runtime.InteropServices; using UnityEngine; namespace WeChatWASM { public class WXFileSystemManager { #if UNITY_WEBGL [DllImport("__Internal")] #endif private static extern string WXWriteFileSync(string filePath, string data, string encoding); #if UNITY_WEBGL [DllImport("__Internal")] #endif private static extern string WXWriteBinFileSync(string filePath, byte[] data, int dataLength, string encoding); #if UNITY_WEBGL [DllImport("__Internal")] #endif private static extern string WXWriteFile(string filePath, byte[] data, int dataLength, string encoding, string s, string f, string c); #if UNITY_WEBGL [DllImport("__Internal")] #endif private static extern string WXWriteStringFile(string filePath, string data, string encoding, string s, string f, string c); #if UNITY_WEBGL [DllImport("__Internal")] #endif private static extern string WXAppendFile(string filePath, byte[] data, int dataLength, string encoding, string s, string f, string c); #if UNITY_WEBGL [DllImport("__Internal")] #endif private static extern string WXAppendStringFile(string filePath, string data, string encoding, string s, string f, string c); #if UNITY_WEBGL [DllImport("__Internal")] #endif private static extern string WXReadFile(string filePath, string encoding, string callbackId); #if UNITY_WEBGL [DllImport("__Internal")] #endif private static extern int WXReadBinFileSync(string filePath); #if UNITY_WEBGL [DllImport("__Internal")] #endif private static extern string WXReadFileSync(string filePath,string encoding); #if UNITY_WEBGL [DllImport("__Internal")] #endif private static extern string WXShareFileBuffer(byte[] data,string callbackId); #if UNITY_WEBGL [DllImport("__Internal")] #endif private static extern string WXAccessFileSync(string filePath); #if UNITY_WEBGL [DllImport("__Internal")] #endif private static extern void WXAccessFile(string filePath,string s,string f,string c); #if UNITY_WEBGL [DllImport("__Internal")] #endif private static extern string WXCopyFileSync(string srcPath, string destPath); #if UNITY_WEBGL [DllImport("__Internal")] #endif private static extern void WXCopyFile(string srcPath, string destPath, string s, string f, string c); #if UNITY_WEBGL [DllImport("__Internal")] #endif private static extern string WXUnlinkSync(string filePath); #if UNITY_WEBGL [DllImport("__Internal")] #endif private static extern void WXUnlink(string filePath, string s, string f, string c); #if UNITY_WEBGL [DllImport("__Internal")] #endif private static extern void WXMkdir(string dirPath, bool recursive, string s, string f, string c); #if UNITY_WEBGL [DllImport("__Internal")] #endif private static extern string WXMkdirSync(string dirPath, bool recursive); /// /// 请不要调用这个,这个是内部使用的回调方法 /// public static void HanldReadFileCallback(string msg) { var res = JsonUtility.FromJson(msg); var conf = ReadFileDict[res.callbackId]; if (conf == null) { return; } if (res.errCode == 1) { var obj = new WXReadFileResponse() { errMsg = res.errMsg }; conf.fail?.Invoke(obj); conf.complete?.Invoke(obj); } else if (string.IsNullOrEmpty(conf.encoding)) { var sharedBuffer = new byte[res.byteLength]; WXShareFileBuffer(sharedBuffer, res.callbackId); var obj = new WXReadFileResponse() { errMsg = res.errMsg, binData = sharedBuffer, }; conf.success?.Invoke(obj); conf.complete?.Invoke(obj); } else { var obj = new WXReadFileResponse() { errMsg = res.errMsg, stringData = res.data }; conf.fail?.Invoke(obj); conf.complete?.Invoke(obj); } ReadFileDict.Remove(res.callbackId); } static Dictionary ReadFileDict = new Dictionary(); /// /// 同步写文件,详见 https://developers.weixin.qq.com/minigame/dev/api/file/FileSystemManager.writeFileSync.html /// /// 要写入的文件路径 (本地路径) /// 要写入的文本 /// 指定写入文件的字符编码 /// 错误信息,如果成功的话返回ok public string WriteFileSync(string filePath, string data, string encoding = "utf8") { return WXWriteFileSync(filePath, data, encoding); } /// /// 同步写文件,详见 https://developers.weixin.qq.com/minigame/dev/api/file/FileSystemManager.writeFileSync.html /// /// 要写入的文件路径 (本地路径) /// 要写入的二进制数据 /// 指定写入文件的字符编码 /// 错误信息,如果成功的话返回ok public string WriteFileSync(string filePath, byte[] data, string encoding = "utf8") { return WXWriteBinFileSync(filePath, data, data.Length, encoding); } /// /// 将二进制写入文件, 详见 https://developers.weixin.qq.com/minigame/dev/api/file/FileSystemManager.writeFile.html /// /// public void WriteFile(WriteFileParam param) { WXWriteFile( param.filePath, param.data, param.data.Length, param.encoding, WXLongCallBackHandler.Add(param.success), WXLongCallBackHandler.Add(param.fail), WXLongCallBackHandler.Add(param.complete) ); } /// /// 将字符串写入文件, 详见 https://developers.weixin.qq.com/minigame/dev/api/file/FileSystemManager.appendFile.html /// /// public void WriteFile(WriteFileStringParam param) { WXWriteStringFile( param.filePath, param.data, param.encoding, WXLongCallBackHandler.Add(param.success), WXLongCallBackHandler.Add(param.fail), WXLongCallBackHandler.Add(param.complete) ); } /// /// 在文件结尾追加二进制内容, 详见 https://developers.weixin.qq.com/minigame/dev/api/file/FileSystemManager.appendFile.html /// /// public void AppendFile(WriteFileParam param) { WXAppendFile( param.filePath, param.data, param.data.Length, param.encoding, WXLongCallBackHandler.Add(param.success), WXLongCallBackHandler.Add(param.fail), WXLongCallBackHandler.Add(param.complete) ); } /// /// 在文件结尾追加文本内容, 详见 https://developers.weixin.qq.com/minigame/dev/api/file/FileSystemManager.appendFile.html /// /// public void AppendFile(WriteFileStringParam param) { WXAppendStringFile( param.filePath, param.data, param.encoding, WXLongCallBackHandler.Add(param.success), WXLongCallBackHandler.Add(param.fail), WXLongCallBackHandler.Add(param.complete) ); } /// /// 读取本地文件内容, 详见 https://developers.weixin.qq.com/minigame/dev/api/file/FileSystemManager.readFile.html /// /// public void ReadFile(ReadFileParam param) { var Rid = UnityEngine.Random.Range(0f, 10000000f).ToString(); var id = param.filePath + Rid; ReadFileDict.Add(param.filePath + Rid, param); WXReadFile(param.filePath, param.encoding, id); } /// /// 同步读取本地文件,详见 https://developers.weixin.qq.com/minigame/dev/api/file/FileSystemManager.readFileSync.html /// /// 要读取的文件的路径 (本地路径) /// 返回结果,失败为null public byte[] ReadFileSync(string filePath) { var length = WXReadBinFileSync(filePath); if (length == 0) { return null; } var sharedBuffer = new byte[length]; WXShareFileBuffer(sharedBuffer, filePath); return sharedBuffer; } /// /// 同步读取本地文件,详见 https://developers.weixin.qq.com/minigame/dev/api/file/FileSystemManager.readFileSync.html /// /// 要读取的文件的路径 (本地路径) /// 指定读取文件的字符编码,不能为空 /// public string ReadFileSync(string filePath,string encodeing) { return WXReadFileSync(filePath, encodeing); } /// /// 同步判断文件/目录是否存在 详见 https://developers.weixin.qq.com/minigame/dev/api/file/FileSystemManager.accessSync.html /// /// 要判断是否存在的文件/目录路径 (本地路径) /// 成功返回 "access:ok" 其他为失败,不可访问 public string AccessSync(string path) { return WXAccessFileSync(path); } /// /// 判断文件/目录是否存在 详见 https://developers.weixin.qq.com/minigame/dev/api/file/FileSystemManager.access.html /// /// public void Access(AccessParam param) { WXAccessFile(param.path, WXCallBackHandler.Add(param.success), WXCallBackHandler.Add(param.fail), WXCallBackHandler.Add(param.complete)); } /// /// 同步复制文件 详见 https://developers.weixin.qq.com/minigame/dev/api/file/FileSystemManager.copyFileSync.html /// /// 源文件路径,支持本地路径 /// 目标文件路径,支持本地路径 /// 成功返回 "copyFile:ok" 其他为失败 public string CopyFileSync(string srcPath, string destPath) { return WXCopyFileSync(srcPath, destPath); } /// /// 复制文件 详见 https://developers.weixin.qq.com/minigame/dev/api/file/FileSystemManager.copyFile.html /// /// public void CopyFile(CopyFileParam param) { WXCopyFile(param.srcPath, param.destPath, WXCallBackHandler.Add(param.success), WXCallBackHandler.Add(param.fail), WXCallBackHandler.Add(param.complete)); } /// /// 同步删除文件 详见 https://developers.weixin.qq.com/minigame/dev/api/file/FileSystemManager.unlinkSync.html /// /// 源文件路径,支持本地路径 /// 成功返回 "unlink:ok" 其他为失败 public string UnlinkSync(string filePath) { return WXUnlinkSync(filePath); } /// /// 删除文件 详见 https://developers.weixin.qq.com/minigame/dev/api/file/FileSystemManager.unlink.html /// /// public void Unlink(UnlinkParam param) { WXUnlink(param.filePath, WXCallBackHandler.Add(param.success), WXCallBackHandler.Add(param.fail), WXCallBackHandler.Add(param.complete)); } /// /// 创建目录, 详见 https://developers.weixin.qq.com/minigame/dev/api/file/FileSystemManager.mkdir.html /// /// public void Mkdir(MkdirParam param) { WXMkdir(param.dirPath, param.recursive,WXCallBackHandler.Add(param.success), WXCallBackHandler.Add(param.fail), WXCallBackHandler.Add(param.complete)); } /// /// 同步创建目录,详见 https://developers.weixin.qq.com/minigame/dev/api/file/FileSystemManager.mkdirSync.html /// /// 创建的目录路径 (本地路径) /// 是否在递归创建该目录的上级目录后再创建该目录。如果对应的上级目录已经存在,则不创建该上级目录。如 dirPath 为 a/b/c/d 且 recursive 为 true,将创建 a 目录,再在 a 目录下创建 b 目录,以此类推直至创建 a/b/c 目录下的 d 目录。 /// public string MkdirSync(string dirPath,bool recursive) { return WXMkdirSync(dirPath, recursive); } } }