Files
tianrunCRM/Assets/CoolapeFrame/Scripts/toolkit/FileEx.cs

446 lines
11 KiB
C#
Raw Normal View History

2020-07-04 14:41:25 +08:00
/*
********************************************************************************
*Copyright(C),coolae.net
*Author: chenbin
*Version: 2.0
*Date: 2017-01-09
*Description:
*Others:
*History:
*********************************************************************************
*/
using UnityEngine;
using System;
using System.IO;
using System.Text;
using System.Collections;
namespace Coolape
{
/*
On a desktop computer (Mac OS or Windows) the location of the files can be obtained with the following code:-
path = Application.dataPath + "/StreamingAssets";
On iOS, you should use:-
path = Application.dataPath + "/Raw";
...while on Android, you should use:-
path = "jar:file://" + Application.dataPath + "!/assets/";
*/
public class FileEx
{
public static bool FileExists (string fn)
{
try {
return File.Exists (fn);
} catch (Exception e) {
Debug.Log (e.Message);
}
return false;
}
public static void WriteAllBytes (string fn, byte[] bytes)
{
try {
File.WriteAllBytes (fn, bytes);
} catch (Exception e) {
Debug.Log (e.Message);
}
}
public static byte[] ReadAllBytes (string fn)
{
try {
if (fn.StartsWith ("jar:file:")) {
return FileEx.readBytesFromStreamingAssetsPath (fn);
} else {
return File.ReadAllBytes (fn);
}
} catch (Exception e) {
Debug.Log (e.Message);
}
return null;
}
public static void WriteAllText (string fn, string str)
{
try {
File.WriteAllText (fn, str);
} catch (Exception e) {
Debug.Log (e.Message);
}
}
public static void AppendAllText (string fn, string str)
{
try {
File.AppendAllText (fn, str);
} catch (Exception e) {
Debug.Log (e.Message);
}
}
public static string ReadAllText (string fn)
{
try {
if (fn.StartsWith ("jar:file:")) {
return FileEx.readTextFromStreamingAssetsPath (fn);
} else {
if (!FileEx.FileExists (fn))
return null;
return File.ReadAllText (fn);
}
} catch (Exception e) {
Debug.Log (e.Message);
}
return "";
}
public static void Delete (string fn)
{
try {
File.Delete (fn);
} catch (Exception e) {
Debug.Log (e.Message);
}
}
public static bool DirectoryExists (string path)
{
return Directory.Exists (path);
}
public static bool CreateDirectory (string path)
{
if (DirectoryExists (path))
return true;
DirectoryInfo di = Directory.CreateDirectory (path);
return di.Exists;
}
public static string[] GetFiles (string fn)
{
try {
return Directory.GetFiles (fn);
} catch (Exception e) {
Debug.Log (e.Message);
}
return new string[0];
}
public static string[] GetFiles ()
{
return GetFiles ("");
}
public static void SaveTexture2D (string fn, byte[] data)
{
try {
if (fn == null || fn.Length <= 0 || data == null || data.Length <= 0)
return;
string path = fn;
File.WriteAllBytes (path, data);
} catch (Exception e) {
Debug.Log (e.Message);
}
}
public static Texture2D LoadTexture2D (int w, int h, string fn)
{
try {
string path = fn;
if (!File.Exists (path))
return null;
byte[] bytes = File.ReadAllBytes (path);
if (bytes == null || bytes.Length <= 10)
return null;
Texture2D r2 = new Texture2D (w, h);
bool succ = r2.LoadImage (bytes);
if (!succ)
return null;
return r2;
} catch (Exception e) {
Debug.Log (e.Message);
}
return null;
}
#if UNITY_ANDROID && !UNITY_EDITOR
static AndroidJavaClass _jcAssetMgr;
static AndroidJavaClass jcAssetMgr {
get {
if (_jcAssetMgr == null) {
_jcAssetMgr = new AndroidJavaClass ("com.coolape.u3dPlugin.AssetMgr");
}
return _jcAssetMgr;
}
}
#endif
public static string readTextFromStreamingAssetsPath (string filepath)
{
string buff = null;
try {
#if UNITY_ANDROID && !UNITY_EDITOR
string tempPath = filepath.Replace(PStr.b().a(Application.streamingAssetsPath).a("/").e(), "");
buff = jcAssetMgr.CallStatic<string>("getString", tempPath);
#else
if (File.Exists (filepath)) {
buff = File.ReadAllText (filepath);
}
#endif
} catch (Exception e) {
Debug.LogError (e);
}
return buff;
}
public static byte[] readBytesFromStreamingAssetsPath (string filepath)
{
byte[] buff = null;
try {
#if UNITY_ANDROID && !UNITY_EDITOR
#if UNITY_2019_2_OR_NEWER
sbyte[] sbuff = null;
string tempPath = filepath.Replace(PStr.b().a(Application.streamingAssetsPath).a("/").e(), "");
AndroidJavaObject obj = jcAssetMgr.CallStatic<AndroidJavaObject>("getBytes", tempPath);
if (obj != null && obj.GetRawObject().ToInt32() != 0) {
sbuff = AndroidJNIHelper.ConvertFromJNIArray<sbyte[]>(obj.GetRawObject());
}
if(obj != null) {
obj.Dispose();
obj = null;
}
buff = Array.ConvertAll<sbyte, byte>(sbuff, a => (byte)a);
#else
string tempPath = filepath.Replace(PStr.b().a(Application.streamingAssetsPath).a("/").e(), "");
AndroidJavaClass jc = new AndroidJavaClass("com.coolape.u3dPlugin.AssetMgr");
buff = jc.CallStatic<byte[]>("getBytes", tempPath);
#endif
#else
if (File.Exists (filepath)) {
buff = File.ReadAllBytes (filepath);
}
#endif
} catch (Exception e) {
Debug.LogError (e);
}
return buff;
}
/// <summary>
/// Reads the new all text. 同步读取。优先从persistentDataPath目录取得再从streamingAssetsPath读书
/// </summary>
/// <returns>The new all text.</returns>
/// <param name="fName">F name.</param>
public static string readNewAllText (string fName)
{
try {
string buff = "";
#if UNITY_WEBGL
if (!CLCfgBase.self.isEditMode)
{
byte[] bytes = CLPreLoadRes4Webgl.getContent(fName);
if (bytes != null)
{
buff = Encoding.UTF8.GetString(bytes);
}
return buff;
}
#endif
string fPath = CLPathCfg.persistentDataPath + "/" + fName;
if (File.Exists (fPath)) {
buff = File.ReadAllText (fPath);
} else {
fPath = Application.streamingAssetsPath + "/" + fName;
buff = ReadAllText (fPath);
}
#if UNITY_EDITOR
if (buff == null) {
Debug.LogError ("Get null content == " + fPath);
}
#endif
return buff;
} catch (Exception e) {
Debug.LogError (e);
return "";
}
}
/// <summary>
/// Reads the new all text. 异步读取。优先从persistentDataPath目录取得再从streamingAssetsPath读书
/// </summary>
/// <returns>The new all text.</returns>
/// <param name="fName">F name.</param>
public static IEnumerator readNewAllTextAsyn (string fName, object OnGet)
{
string buff = "";
#if UNITY_WEBGL
if (!CLCfgBase.self.isEditMode)
{
byte[] bytes = CLPreLoadRes4Webgl.getContent(fName);
if(bytes != null)
{
buff = Encoding.UTF8.GetString(bytes);
}
}
else
{
buff = readNewAllText(fName);
}
yield return null;
#else
string fPath = CLPathCfg.persistentDataPath + "/" + fName;
if (File.Exists (fPath)) {
yield return null;
buff = File.ReadAllText (fPath);
} else {
fPath = Application.streamingAssetsPath + "/" + fName;
if (Application.platform == RuntimePlatform.Android) {
WWW www = new WWW (Utl.urlAddTimes (fPath));
yield return www;
buff = www.text;
www.Dispose ();
www = null;
} else {
yield return null;
if (File.Exists (fPath)) {
buff = File.ReadAllText (fPath);
}
}
}
#if UNITY_EDITOR
if (buff == null) {
Debug.LogError ("Get null content == " + fPath);
}
#endif
#endif
Utl.doCallback (OnGet, buff);
}
/// <summary>
/// Reads the new all text. 同步步读取。优先从persistentDataPath目录取得再从streamingAssetsPath读书
/// </summary>
/// <returns>The new all text.</returns>
/// <param name="fName">F name.</param>
public static byte[] readNewAllBytes (string fName)
{
try {
byte[] buff = null;
#if UNITY_WEBGL
if (!CLCfgBase.self.isEditMode)
{
return CLPreLoadRes4Webgl.getContent(fName);
}
#endif
string fPath = CLPathCfg.persistentDataPath + "/" + fName;
if (File.Exists (fPath)) {
buff = FileEx.ReadAllBytes (fPath);
} else {
fPath = Application.streamingAssetsPath + "/" + fName;
buff = FileEx.ReadAllBytes (fPath);
}
#if UNITY_EDITOR
if (buff == null) {
Debug.LogError ("Get null content == " + fPath);
}
#endif
return buff;
} catch (Exception e) {
Debug.LogError (e);
return null;
}
}
/// <summary>
/// Reads the new all text. 异步读取。优先从persistentDataPath目录取得再从streamingAssetsPath读书
/// </summary>
/// <returns>The new all text.</returns>
/// <param name="fName">F name.</param>
public static IEnumerator readNewAllBytesAsyn (string fName, object OnGet)
{
byte[] buff = null;
string fPath = CLPathCfg.persistentDataPath + "/" + fName;
#if UNITY_WEBGL
if (!CLCfgBase.self.isEditMode)
{
buff = CLPreLoadRes4Webgl.getContent(fName);
}
else
{
buff = readNewAllBytes(fName);
}
yield return null;
#else
if (File.Exists (fPath)) {
yield return null;
buff = File.ReadAllBytes (fPath);
} else {
fPath = Application.streamingAssetsPath + "/" + fName;
if (Application.platform == RuntimePlatform.Android) {
WWW www = new WWW (Utl.urlAddTimes (fPath));
yield return www;
if (string.IsNullOrEmpty (www.error)) {
buff = www.bytes;
www.Dispose ();
www = null;
}
} else {
yield return null;
if (File.Exists (fPath)) {
buff = File.ReadAllBytes (fPath);
}
}
}
#if UNITY_EDITOR
if (buff == null) {
Debug.LogWarning ("Get null content == " + fPath);
}
#endif
#endif
Utl.doCallback (OnGet, buff);
}
public static Hashtable FileTextMap = new Hashtable ();
public static Hashtable FileBytesMap = new Hashtable ();
public static string getTextFromCache (string path)
{
if (string.IsNullOrEmpty (path))
return null;
string ret = MapEx.getString (FileTextMap, path);
if (string.IsNullOrEmpty (ret)) {
ret = FileEx.ReadAllText (path);
FileTextMap [path] = ret;
}
return ret;
}
public static byte[] getBytesFromCache (string path)
{
if (string.IsNullOrEmpty (path))
return null;
byte[] ret = MapEx.getBytes (FileBytesMap, path);
if (ret == null) {
ret = FileEx.ReadAllBytes (path);
FileBytesMap [path] = ret;
}
return ret;
}
public static void cleanCache ()
{
FileTextMap.Clear ();
FileBytesMap.Clear ();
}
}
}