add
This commit is contained in:
445
Assets/CoolapeFrame/Scripts/toolkit/FileEx.cs
Normal file
445
Assets/CoolapeFrame/Scripts/toolkit/FileEx.cs
Normal file
@@ -0,0 +1,445 @@
|
||||
/*
|
||||
********************************************************************************
|
||||
*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 ();
|
||||
}
|
||||
}
|
||||
}
|
||||
Reference in New Issue
Block a user