# LabTools.cs
### 主要修改處
* 28 - 32
```csharp=
using System;
using System.Collections;
using System.Collections.Generic;
using System.ComponentModel;
using System.IO;
using System.Linq;
using System.Reflection;
using System.Threading.Tasks;
using DataSync;
//using I2.Loc;
using Newtonsoft.Json;
//using Newtonsoft.Json.Linq;
//using Newtonsoft.Json.Schema;
//using Newtonsoft.Json.Schema.Generation;
using UnityEngine;
namespace LabData
{
public class LabTools
{
public static T GetData<T>(LabDataBase data) where T : LabDataBase
{
return data is T @base ? @base : null;
}
public static string DataPath =>
#if UNITY_ANDROID
Application.persistentDataPath;
#else
Application.dataPath;
#endif
/// <summary>
/// 创建存储数据的文件夹
/// </summary>
/// <param name="floderName"></param>
/// <param name="isNew"></param>
public static string CreatSaveDataFolder(string floderName, bool isNew = false)
{
if (Directory.Exists(floderName))
{
if (isNew)
{
var tempPath = floderName + "_" + DateTime.Now.Millisecond.ToString();
Directory.CreateDirectory(tempPath);
return tempPath;
}
Debug.Log("Folder Has Existed!");
return floderName;
}
else
{
Directory.CreateDirectory(floderName);
Debug.Log("Success Create: " + floderName);
return floderName;
}
}
/// <summary>
/// 创建文件
/// </summary>
/// <param name="path"></param>
public static void CreatData(string path)
{
if (!File.Exists(path))
{
File.Create(path).Dispose();
Debug.Log("Success Create: " + path);
}
}
/// <summary>
/// 获取Enum的Description内容
/// </summary>
/// <typeparam name="T"></typeparam>
/// <param name="obj"></param>
/// <returns></returns>
public static string GetEnumDescription<T>(T obj)
{
var type = obj.GetType();
FieldInfo field = type.GetField(Enum.GetName(type, obj));
DescriptionAttribute descAttr = Attribute.GetCustomAttribute(field, typeof(DescriptionAttribute)) as DescriptionAttribute;
if (descAttr == null)
{
return string.Empty;
}
return descAttr.Description;
}
/// <summary>
/// 根据Config类型反序列化,如果是需要覆盖旧的config,传入true
/// </summary>
/// <typeparam name="T"></typeparam>
/// <param name="isNew"></param>
/// <param name="filePath"></param>
/// <returns></returns>
public static T GetConfig<T>(bool isNew = false, string filePath = "/GameData") where T : class, new()
{
var path = DataPath + filePath + "/" + "ConfigData";
if (!Directory.Exists(path))
{
Directory.CreateDirectory(path);
}
path = path + "/" + typeof(T).Name + ".json";
if (isNew && File.Exists(path))
{
File.Delete(path);
}
if (!File.Exists(path))
{
var json = JsonConvert.SerializeObject(new T());
var fs = new FileStream(path, FileMode.OpenOrCreate, FileAccess.ReadWrite);
StreamWriter sw = new StreamWriter(fs);
sw.Write(json);
sw.Close();
}
StreamReader sr = new StreamReader(path);
var data = JsonConvert.DeserializeObject<T>(sr.ReadToEnd());
sr.Close();
return data;
}
/// <summary>
/// 创建对应数据的文件夹
/// </summary>
/// <typeparam name="T"></typeparam>
public static void CreateDataFolder<T>(string filePath = "/GameData") where T : LabDataBase
{
var path = DataPath + filePath + "/" + typeof(T).Name;
if (!Directory.Exists(path))
{
Directory.CreateDirectory(path);
}
}
/// <summary>
/// 写数据,数据类型必须继承LabDataBase,dataName为需要写的数据名字,isOverWrite选择是否要覆盖已有文件
/// </summary>
/// <typeparam name="T"></typeparam>
/// <param name="t"></param>
/// <param name="dataName"></param>
/// <param name="isOverWrite"></param>
/// <returns></returns>
public static void WriteData<T>(T t, string dataName, bool isOverWrite = false, string filePath = "/GameData") where T : LabDataBase, new()
{
var path = DataPath + filePath + "/" + typeof(T).Name + "/" + dataName + ".json";
if (!File.Exists(path))
{
var json = JsonConvert.SerializeObject(t);
var fs = new FileStream(path, FileMode.OpenOrCreate, FileAccess.ReadWrite);
StreamWriter sw = new StreamWriter(fs);
sw.Write(json);
sw.Close();
}
else if (File.Exists(path) && isOverWrite)
{
var json = JsonConvert.SerializeObject(t);
var fs = new FileStream(path, FileMode.Truncate, FileAccess.ReadWrite);
fs.Close();
fs = new FileStream(path, FileMode.OpenOrCreate, FileAccess.ReadWrite);
StreamWriter sw = new StreamWriter(fs);
sw.Write(json);
sw.Close();
}
else
{
Debug.LogError("需要重写数据,请在参数中设置isOverWrite=true");
}
}
/// <summary>
/// 通过类型T和名字获取指定的数据
/// </summary>
/// <typeparam name="T"></typeparam>
/// <param name="t"></param>
/// <param name="dataName"></param>
/// <returns></returns>
public static T GetData<T>(string dataName, string filePath = "/GameData") where T : LabDataBase
{
var path = DataPath + filePath + "/" + typeof(T).Name + "/" + dataName + ".json";
if (File.Exists(path))
{
StreamReader sr = new StreamReader(path);
var data = JsonConvert.DeserializeObject<T>(sr.ReadToEnd());
sr.Close();
return data;
}
else
{
Debug.LogError("数据文件不存在!");
return null;
}
}
/// <summary>
/// 通过类型T和名字获取指定的数据
/// </summary>
/// <typeparam name="T"></typeparam>
/// <param name="t"></param>
/// <param name="dataName"></param>
/// <returns></returns>
//public static T GetDataByString<T>(string file) where T : class
//{
// JSchema schema = new JSchemaGenerator().Generate(typeof(T));
// Debug.Log(schema);
// JToken token = JToken.Parse(file);
// if (token.IsValid(schema))
// {
// return JsonConvert.DeserializeObject<T>(file);
// }
// else
// {
// Debug.LogError("字符串不匹配");
// return null;
// }
//}
/// <summary>
/// 删除数据文件
/// </summary>
/// <typeparam name="T"></typeparam>
/// <param name="dataName"></param>
public static void DeleteData<T>(string dataName, string filePath = "/GameData") where T : LabDataBase
{
var path = DataPath + filePath + "/" + typeof(T).Name + "/" + dataName + ".json";
if (!File.Exists(path))
{
Debug.LogError("数据文件不存在!");
}
else
{
File.Delete(path);
}
}
/// <summary>
/// 获取对应数据的文件夹内的所有文件的名字List
/// </summary>
/// <typeparam name="T"></typeparam>
/// <param name="isGetName"></param>
/// <returns></returns>
public static List<string> GetDataName<T>(bool isGetName = false, string filePath = "/GameData") where T : LabDataBase
{
var path = DataPath + filePath + "/" + typeof(T).Name;
if (Directory.Exists(path))
{
var root = new DirectoryInfo(path);
var files = root.GetFiles();
if (files.Length <= 0)
{
Debug.LogError("没有可用数据文件!");
return null;
}
List<string> tempList = new List<string>();
foreach (var fileInfo in files)
{
if (".json".ToLower().IndexOf(fileInfo.Extension.ToLower(), StringComparison.Ordinal) >= 0)
{
tempList.Add(fileInfo.Name.Split('.').First());
}
}
return tempList;
}
Debug.LogError("数据文件夹不存在!");
return null;
}
/// <summary>
///通过Key获取多语言对应的值
/// </summary>
/// <param name="key"></param>
/// <returns></returns>
/*
public static string GetCurrentCultureValue(params string[] key)
{
return string.Join("", key.Select(p =>
{
var translate = LocalizationManager.GetTranslation(p);
if (p != null && string.IsNullOrEmpty(translate))
{
return p;
}
return translate;
}));
}
*/
public static Type GetScriptType(string name)
{
return Type.GetType("UIFrameWork." + name);
}
}
}
```