using Cysharp.Threading.Tasks; using Newtonsoft.Json; using System; using System.Collections; using System.Collections.Generic; using System.IO; using System.Linq; using System.Runtime.Serialization.Formatters.Binary; using System.Text; using System.Threading.Tasks; using UnityEngine; namespace TFramework { /// /// 文件操作 /// public static class FileOperations { /// /// 路径暂存列表 /// static List paths = new List(); #region Json static JsonSerializerSettings settings = new JsonSerializerSettings { TypeNameHandling = TypeNameHandling.Auto, // 或 TypeNameHandling.All Formatting = Formatting.Indented, ReferenceLoopHandling = ReferenceLoopHandling.Ignore, }; /// /// 写入Json数据 /// /// 数据 /// 文件完整路径 public static void WriteJsonData(object data, string path) { string json = JsonConvert.SerializeObject(data, settings); WriteData(json, path); } /// /// 异步写入Json数据 /// /// 数据 /// 文件完整路径 public async static UniTask WriteJsonDataAsync(object data, string path) { string json = JsonConvert.SerializeObject(data, settings); await WriteDataAsync(json, path); } /// /// 读取Json数据 /// /// 数据类型 /// 数据完整路径 /// public static T ReadJsonData(string path) { if (FileExists(path)) return JsonConvert.DeserializeObject(ReadText(path), settings); else return default(T); } /// /// 异步读取Json数据 /// /// 数据类型 /// 数据完整路径 /// public static async UniTask ReadJsonDataAsync(string path) { if (FileExists(path)) return JsonConvert.DeserializeObject(await ReadTextAsync(path), settings); else return default(T); } #endregion /// /// 写入数据 /// /// 要写入的数据 /// 数据完整路径 public static void WriteData(string value, string path) { //打开或者新建文档 using (StreamWriter sw = new StreamWriter(path)) { //保存数据 sw.WriteLine(value); //关闭文档 sw.Close(); sw.Dispose(); } } /// /// 异步写入数据 /// /// 要写入的数据 /// 数据完整路径 public static async UniTask WriteDataAsync(string value, string path) { //打开或者新建文档 using (StreamWriter sw = new StreamWriter(path)) { //保存数据 await sw.WriteAsync(value); //关闭文档 sw.Close(); sw.Dispose(); } } /// /// 以二进制形式写入数据 /// /// 数据 /// 数据完整路径 public static void WriteBinaryData(System.Object obj, string path) { try { string folderPath = path.Remove(path.LastIndexOf('/')); if (!Directory.Exists(folderPath)) Directory.CreateDirectory(folderPath); BinaryFormatter binary = new BinaryFormatter(); using (FileStream fs = File.Create(path)) { binary.Serialize(fs, obj); } } catch (Exception e) { Log.Error(e.Message); } } /// /// 读取二进制文件 /// /// 文件类型 /// 文件路径 /// public static T ReadBinaryData(string path) { try { BinaryFormatter binary = new BinaryFormatter(); using (FileStream fs = File.Open(path, FileMode.Open)) { return (T)binary.Deserialize(fs); } } catch (Exception e) { Log.Info(e.Message); return default(T); } } public static byte[] SafeReadAllBytes(string inFile) { try { if (string.IsNullOrEmpty(inFile) || !File.Exists(inFile)) return null; File.SetAttributes(inFile, FileAttributes.Normal); return File.ReadAllBytes(inFile); } catch (System.Exception ex) { Log.Error(string.Format("SafeReadAllBytes failed! path = {0} with err = {1}", inFile, ex.Message)); return null; } } /// /// 读取文本数据 /// /// 数据完整路径 /// public static string ReadText(string path) { if (!File.Exists(path)) return null; using (StreamReader str = new StreamReader(path, Encoding.UTF8)) { if (str == null) return null; return str.ReadToEnd(); } } /// /// 异步读取文本数据 /// /// 数据完整路径 /// public async static UniTask ReadTextAsync(string path) { if (!File.Exists(path)) return null; using (StreamReader str = new StreamReader(path, Encoding.UTF8)) { if (str == null) return null; return await str.ReadToEndAsync(); } } /// /// 读取Texture2D文件 /// /// /// public static Texture2D ReadTexture2D(string path) { if (!File.Exists(path)) return null; FileStream fs = new FileStream(path, FileMode.Open); byte[] buffer = new byte[fs.Length]; fs.Read(buffer, 0, buffer.Length); fs.Close(); Texture2D originalTex = new Texture2D(2, 2); var iSLoad = originalTex.LoadImage(buffer); originalTex.Apply(); if (iSLoad) return originalTex; else return null; } /// /// 获取文件夹下所有文件路径 /// /// 文件夹路径 /// 要排除的文件的后缀 /// public static string[] GetFolderAllFilePath(string dir, params string[] excludeFile) { paths.Clear(); FindFile(dir, excludeFile); return paths.ToArray(); } static void FindFile(string dir, params string[] excludeFile) { DirectoryInfo info = new DirectoryInfo(dir); FileSystemInfo[] file = info.GetFileSystemInfos(); foreach (var item in file) { if (item is DirectoryInfo) FindFile(item.FullName, excludeFile); else { if (excludeFile != null) { string suffix = item.Extension; bool isAdd = true; foreach (var su in excludeFile) { if (suffix == su) isAdd = false; } if (isAdd) paths.Add(item.FullName); } else paths.Add(item.FullName); } } } /// /// 获取路径下所有文件夹路径 /// /// 路径 /// public static string[] GetPathAllFolders(string path) { paths.Clear(); FindFolders(path); return paths.ToArray(); } static void FindFolders(string path) { DirectoryInfo info = new DirectoryInfo(path); FileSystemInfo[] file = info.GetFileSystemInfos(); foreach (var item in file) { if (item is DirectoryInfo) { FindFolders(item.FullName); paths.Add(item.FullName); } } } /// /// 拷贝文件夹 /// /// /// /// 是否覆盖已有同名文件 public static void CopyDirectory(string sourceDirName, string destDirName,bool isOverlay=false) { try { if (!Directory.Exists(destDirName)) { Directory.CreateDirectory(destDirName); File.SetAttributes(destDirName, File.GetAttributes(sourceDirName)); } if (destDirName[destDirName.Length - 1] != Path.DirectorySeparatorChar) destDirName = destDirName + Path.DirectorySeparatorChar; string[] files = Directory.GetFiles(sourceDirName); foreach (string file in files) { if (File.Exists(destDirName + Path.GetFileName(file))&&!isOverlay) continue; FileInfo fileInfo = new FileInfo(file); if (fileInfo.Extension.Equals(".meta", StringComparison.CurrentCultureIgnoreCase)) continue; File.Copy(file, destDirName + Path.GetFileName(file), true); File.SetAttributes(destDirName + Path.GetFileName(file), FileAttributes.Normal); } string[] dirs = Directory.GetDirectories(sourceDirName); foreach (string dir in dirs) { CopyDirectory(dir, destDirName + Path.GetFileName(dir),isOverlay); } } catch (Exception ex) { throw ex; } } /// /// 拷贝文件 /// /// /// public static void CopyFile(string sourceFileNmae,string destFlieName) { FileInfo file = new FileInfo(sourceFileNmae); if (file.Exists) file.CopyTo(destFlieName, true); else Log.Error($"目标文件【{sourceFileNmae}】不存在!"); } /// /// 检查文件路径是否存在 /// /// /// public static bool FileExists(string path) => File.Exists(path); /// /// 检查文件夹是否存在 /// /// /// public static bool FolderExists(string path) => Directory.Exists(path); /// /// 获取文件夹下指定类型文件信息 /// /// 文件夹 /// 后缀 /// public static FileInfo[] GetFiles(string folder, string suffix) { if (!Directory.Exists(folder)) return null; DirectoryInfo di = new DirectoryInfo(folder); return di.GetFiles().ToList().Where(p => p.Extension == suffix).Select(p => p).ToArray(); } /// /// 获取文件夹下指定类型文件信息 /// /// 文件夹 /// 后缀 /// public static FileInfo[] GetFiles(string folder, string suffix, IComparer comparer) { if (!Directory.Exists(folder)) return null; DirectoryInfo di = new DirectoryInfo(folder); FileInfo[] fileInfo = di.GetFiles().ToList().Where(p => p.Extension == suffix).Select(p => p).ToArray(); Array.Sort(fileInfo, comparer); return fileInfo; } /// /// 按时间排序 /// /// public static IComparer SortToTime => new FileTimeComparer(); public class FileTimeComparer : IComparer { public int Compare(object x, object y) { FileInfo file1 = x as FileInfo; FileInfo file2 = y as FileInfo; return file1.LastWriteTime.CompareTo(file2.LastWriteTime); } } public static void CreateFloder(string path) => Directory.CreateDirectory(path); /// /// 创建项目绝对路径文件夹 /// /// public static void CreateAbsoluteFloder(string path) { CreateFloder(GetAbsolutePath(path)); } /// /// 获取相对项目路径的绝对路径 /// /// /// public static string GetAbsolutePath(string path) { string _path = Application.dataPath.Remove(Application.dataPath.LastIndexOf('/') + 1); return _path + path; } } }