655 lines
18 KiB
C#
655 lines
18 KiB
C#
using System;
|
||
using System.Collections;
|
||
using System.Collections.Generic;
|
||
using System.IO;
|
||
using System.Security.Cryptography;
|
||
using System.Text;
|
||
using UnityEngine;
|
||
using UnityEngine.Networking;
|
||
|
||
public enum enFileOperation
|
||
{
|
||
ReadFile,
|
||
WriteFile,
|
||
DeleteFile,
|
||
CreateDirectory,
|
||
DeleteDirectory
|
||
}
|
||
|
||
public class FileManager
|
||
{
|
||
public delegate void DelegateOnOperateFileFail(string fullPath, enFileOperation fileOperation);
|
||
|
||
private static string s_cachePath = null;
|
||
|
||
public static string s_ifsExtractFolder = "AssetBundle";
|
||
|
||
private static string s_ifsExtractPath = null;
|
||
|
||
private static string ab_buildPath = null;
|
||
|
||
private static MD5CryptoServiceProvider s_md5Provider = new MD5CryptoServiceProvider();
|
||
|
||
public static FileManager.DelegateOnOperateFileFail s_delegateOnOperateFileFail = delegate
|
||
{
|
||
|
||
};
|
||
|
||
public static bool ClearDirectory(string fullPath)
|
||
{
|
||
bool result;
|
||
try
|
||
{
|
||
string[] files = Directory.GetFiles(fullPath);
|
||
for (int i = 0; i < files.Length; i++)
|
||
{
|
||
File.Delete(files[i]);
|
||
}
|
||
string[] directories = Directory.GetDirectories(fullPath);
|
||
for (int j = 0; j < directories.Length; j++)
|
||
{
|
||
//Directory.Delete(directories[j], true);
|
||
}
|
||
result = true;
|
||
}
|
||
catch (Exception)
|
||
{
|
||
result = false;
|
||
}
|
||
return result;
|
||
}
|
||
|
||
public static bool ClearDirectory(string fullPath, string[] fileExtensionFilter, string[] folderFilter)
|
||
{
|
||
bool result;
|
||
try
|
||
{
|
||
if (fileExtensionFilter != null)
|
||
{
|
||
string[] files = Directory.GetFiles(fullPath);
|
||
for (int i = 0; i < files.Length; i++)
|
||
{
|
||
if (fileExtensionFilter != null && fileExtensionFilter.Length > 0)
|
||
{
|
||
for (int j = 0; j < fileExtensionFilter.Length; j++)
|
||
{
|
||
if (files[i].Contains(fileExtensionFilter[j]))
|
||
{
|
||
FileManager.DeleteFile(files[i]);
|
||
break;
|
||
}
|
||
}
|
||
}
|
||
}
|
||
}
|
||
if (folderFilter != null)
|
||
{
|
||
string[] directories = Directory.GetDirectories(fullPath);
|
||
for (int k = 0; k < directories.Length; k++)
|
||
{
|
||
if (folderFilter != null && folderFilter.Length > 0)
|
||
{
|
||
for (int l = 0; l < folderFilter.Length; l++)
|
||
{
|
||
if (directories[k].Contains(folderFilter[l]))
|
||
{
|
||
FileManager.DeleteDirectory(directories[k]);
|
||
break;
|
||
}
|
||
}
|
||
}
|
||
}
|
||
}
|
||
result = true;
|
||
}
|
||
catch (Exception)
|
||
{
|
||
result = false;
|
||
}
|
||
return result;
|
||
}
|
||
|
||
public static string CombinePath(string path1, string path2)
|
||
{
|
||
StringBuilder sb= new StringBuilder();
|
||
sb.Append(path1);
|
||
sb.Append("/");
|
||
sb.Append(path2);
|
||
return ReplacePathSymbol(sb.ToString());
|
||
}
|
||
|
||
public static string CombinePaths(params string[] values)
|
||
{
|
||
if (values.Length <= 0)
|
||
{
|
||
return string.Empty;
|
||
}
|
||
if (values.Length == 1)
|
||
{
|
||
return FileManager.CombinePath(values[0], string.Empty);
|
||
}
|
||
if (values.Length > 1)
|
||
{
|
||
string text = FileManager.CombinePath(values[0], values[1]);
|
||
for (int i = 2; i < values.Length; i++)
|
||
{
|
||
text = FileManager.CombinePath(text, values[i]);
|
||
}
|
||
return text;
|
||
}
|
||
return string.Empty;
|
||
}
|
||
|
||
public static void CopyFile(string srcFile, string dstFile)
|
||
{
|
||
File.Copy(srcFile, dstFile, true);
|
||
}
|
||
|
||
public static bool CreateDirectory(string directory)
|
||
{
|
||
if (FileManager.IsDirectoryExist(directory))
|
||
{
|
||
return true;
|
||
}
|
||
int num = 0;
|
||
bool result;
|
||
while (true)
|
||
{
|
||
try
|
||
{
|
||
Directory.CreateDirectory(directory);
|
||
result = true;
|
||
break;
|
||
}
|
||
catch (Exception ex)
|
||
{
|
||
num++;
|
||
if (num >= 3)
|
||
{
|
||
Debug.Log("Create Directory " + directory + " Error! Exception = " + ex.ToString());
|
||
FileManager.s_delegateOnOperateFileFail(directory, enFileOperation.CreateDirectory);
|
||
result = false;
|
||
break;
|
||
}
|
||
}
|
||
}
|
||
return result;
|
||
}
|
||
|
||
public static bool DeleteDirectory(string directory)
|
||
{
|
||
if (!FileManager.IsDirectoryExist(directory))
|
||
{
|
||
return true;
|
||
}
|
||
int num = 0;
|
||
bool result;
|
||
while (true)
|
||
{
|
||
try
|
||
{
|
||
Directory.Delete(directory, true);
|
||
result = true;
|
||
break;
|
||
}
|
||
catch (Exception ex)
|
||
{
|
||
num++;
|
||
if (num >= 3)
|
||
{
|
||
Debug.Log("Delete Directory " + directory + " Error! Exception = " + ex.ToString());
|
||
FileManager.s_delegateOnOperateFileFail(directory, enFileOperation.DeleteDirectory);
|
||
result = false;
|
||
break;
|
||
}
|
||
}
|
||
}
|
||
return result;
|
||
}
|
||
|
||
public static bool DeleteFile(string filePath)
|
||
{
|
||
if (!FileManager.IsFileExist(filePath))
|
||
{
|
||
return true;
|
||
}
|
||
int num = 0;
|
||
bool result;
|
||
while (true)
|
||
{
|
||
try
|
||
{
|
||
File.Delete(filePath);
|
||
result = true;
|
||
break;
|
||
}
|
||
catch (Exception ex)
|
||
{
|
||
num++;
|
||
if (num >= 3)
|
||
{
|
||
Debug.Log("Delete File " + filePath + " Error! Exception = " + ex.ToString());
|
||
FileManager.s_delegateOnOperateFileFail(filePath, enFileOperation.DeleteFile);
|
||
result = false;
|
||
break;
|
||
}
|
||
}
|
||
}
|
||
return result;
|
||
}
|
||
|
||
public static string EraseExtension(string fullName)
|
||
{
|
||
if (fullName == null)
|
||
{
|
||
return null;
|
||
}
|
||
int num = fullName.LastIndexOf('.');
|
||
if (num > 0)
|
||
{
|
||
return fullName.Substring(0, num);
|
||
}
|
||
return fullName;
|
||
}
|
||
|
||
public static string GetCachePath(string fileName)
|
||
{
|
||
return FileManager.CombinePath(FileManager.GetCachePath(), fileName);
|
||
}
|
||
|
||
public static string GetCachePath()
|
||
{
|
||
if (FileManager.s_cachePath == null)
|
||
{
|
||
//#if UNITY_STANDALONE_WIN
|
||
// FileManager.s_cachePath = CombinePath(Application.streamingAssetsPath, "AssetBundle/"); //特殊处理
|
||
//#else
|
||
FileManager.s_cachePath = PathDefine.AppPersistentDataPathPath();
|
||
//#endif
|
||
}
|
||
return FileManager.s_cachePath;
|
||
}
|
||
|
||
public static string GetCachePathWithHeader(string fileName)
|
||
{
|
||
return FileManager.GetLocalPathHeader() + FileManager.GetCachePath(fileName);
|
||
}
|
||
|
||
public static string GetExtension(string fullName)
|
||
{
|
||
int num = fullName.LastIndexOf('.');
|
||
if (num > 0 && num + 1 < fullName.Length)
|
||
{
|
||
return fullName.Substring(num);
|
||
}
|
||
return string.Empty;
|
||
}
|
||
|
||
public static long GetFileLength(string filePath)
|
||
{
|
||
if (!FileManager.IsFileExist(filePath))
|
||
{
|
||
return 0;
|
||
}
|
||
int num = 0;
|
||
long result = 0;
|
||
while (true)
|
||
{
|
||
try
|
||
{
|
||
FileInfo fileInfo = new FileInfo(filePath);
|
||
result = fileInfo.Length;
|
||
break;
|
||
}
|
||
catch (Exception ex)
|
||
{
|
||
num++;
|
||
if (num >= 3)
|
||
{
|
||
Debug.Log("Get FileLength of " + filePath + " Error! Exception = " + ex.ToString());
|
||
result = 0;
|
||
break;
|
||
}
|
||
}
|
||
}
|
||
return result;
|
||
}
|
||
|
||
public static string GetFullDirectory(string fullPath)
|
||
{
|
||
return Path.GetDirectoryName(fullPath);
|
||
}
|
||
|
||
public static string GetFullName(string fullPath)
|
||
{
|
||
if (fullPath == null)
|
||
{
|
||
return null;
|
||
}
|
||
int num = fullPath.LastIndexOf("/");
|
||
if (num > 0)
|
||
{
|
||
return fullPath.Substring(num + 1, fullPath.Length - num - 1);
|
||
}
|
||
return fullPath;
|
||
}
|
||
|
||
/// <summary>
|
||
/// 获取持久化路径persistentDataPath
|
||
/// </summary>
|
||
/// <returns></returns>
|
||
public static string GetIFSExtractPath()
|
||
{
|
||
if (FileManager.s_ifsExtractPath == null)
|
||
{
|
||
FileManager.s_ifsExtractPath = Path.Combine(FileManager.GetCachePath(), PathDefine.GetPlatformName.ToLower()); //FileManager.CombinePath(FileManager.GetCachePath(), PathDefine.GetPlatformName.ToLower()); //FileManager.s_ifsExtractFolder);
|
||
}
|
||
return FileManager.s_ifsExtractPath;
|
||
}
|
||
|
||
/// <summary>
|
||
/// 获取打包路径
|
||
/// </summary>
|
||
/// <returns></returns>
|
||
public static string GetBuildABPath()
|
||
{
|
||
if (FileManager.ab_buildPath == null)
|
||
{
|
||
FileManager.ab_buildPath = FileManager.CombinePath(PathDefine.ABResPersistentDataPathPath(), PathDefine.GetPlatformName); //FileManager.s_ifsExtractFolder);
|
||
}
|
||
return FileManager.ab_buildPath;
|
||
}
|
||
|
||
|
||
private static string GetLocalPathHeader()
|
||
{
|
||
return "file://";
|
||
}
|
||
|
||
public static string GetFileMd5(string filePath)
|
||
{
|
||
if (!FileManager.IsFileExist(filePath))
|
||
{
|
||
return string.Empty;
|
||
}
|
||
return BitConverter.ToString(FileManager.s_md5Provider.ComputeHash(FileManager.ReadFile(filePath))).Replace("-", string.Empty).ToLower();
|
||
}
|
||
|
||
public static string GetMd5(byte[] data)
|
||
{
|
||
return BitConverter.ToString(FileManager.s_md5Provider.ComputeHash(data)).Replace("-", string.Empty).ToLower();
|
||
}
|
||
|
||
public static string GetMd5(string str)
|
||
{
|
||
return BitConverter.ToString(FileManager.s_md5Provider.ComputeHash(Encoding.UTF8.GetBytes(str))).Replace("-", string.Empty).ToLower();
|
||
}
|
||
|
||
public static string GetStreamingAssetsPathWithHeader(string fileName)
|
||
{
|
||
return Path.Combine(Application.streamingAssetsPath, fileName);
|
||
}
|
||
|
||
public static bool IsDirectoryExist(string directory)
|
||
{
|
||
return Directory.Exists(directory);
|
||
}
|
||
|
||
public static bool IsFileExist(string filePath)
|
||
{
|
||
//#if UNITY_EDITOR
|
||
return File.Exists(filePath);
|
||
//#endif
|
||
|
||
// return true;
|
||
}
|
||
|
||
public static byte[] ReadFile(string filePath)
|
||
{
|
||
if (!FileManager.IsFileExist(filePath))
|
||
{
|
||
Log.Error("file path is not exit :" + filePath);
|
||
return null;
|
||
}
|
||
byte[] array = null;
|
||
try
|
||
{
|
||
array = File.ReadAllBytes(filePath);
|
||
}
|
||
catch (Exception ex)
|
||
{
|
||
|
||
Log.Error(string.Concat(new object[] {
|
||
"Read File ",
|
||
filePath,
|
||
" Error! Exception = ",
|
||
ex.ToString (),
|
||
}));
|
||
array = null;
|
||
}
|
||
|
||
if (array != null && array.Length > 0)
|
||
{
|
||
return array;
|
||
}
|
||
return null;
|
||
}
|
||
|
||
public static bool WriteFile(string filePath, byte[] data, int offset, int length)
|
||
{
|
||
FileStream fileStream = null;
|
||
int num = 0;
|
||
bool result;
|
||
while (true)
|
||
{
|
||
try
|
||
{
|
||
fileStream = new FileStream(filePath, FileMode.OpenOrCreate, FileAccess.Write, FileShare.ReadWrite);
|
||
fileStream.Write(data, offset, length);
|
||
fileStream.Close();
|
||
result = true;
|
||
break;
|
||
}
|
||
catch (Exception ex)
|
||
{
|
||
if (fileStream != null)
|
||
{
|
||
fileStream.Close();
|
||
}
|
||
num++;
|
||
if (num >= 3)
|
||
{
|
||
Debug.Log("Write File " + filePath + " Error! Exception = " + ex.ToString());
|
||
FileManager.DeleteFile(filePath);
|
||
FileManager.s_delegateOnOperateFileFail(filePath, enFileOperation.WriteFile);
|
||
result = false;
|
||
break;
|
||
}
|
||
}
|
||
}
|
||
return result;
|
||
}
|
||
|
||
public static bool WriteFile(string filePath, byte[] data)
|
||
{
|
||
int num = 0;
|
||
bool result;
|
||
while (true)
|
||
{
|
||
try
|
||
{
|
||
File.WriteAllBytes(filePath, data);
|
||
result = true;
|
||
break;
|
||
}
|
||
catch (Exception ex)
|
||
{
|
||
num++;
|
||
if (num >= 3)
|
||
{
|
||
Debug.Log("Write File " + filePath + " Error! Exception = " + ex.ToString());
|
||
FileManager.DeleteFile(filePath);
|
||
FileManager.s_delegateOnOperateFileFail(filePath, enFileOperation.WriteFile);
|
||
result = false;
|
||
break;
|
||
}
|
||
}
|
||
}
|
||
return result;
|
||
}
|
||
|
||
/// <summary>
|
||
/// 统一路径符号
|
||
/// </summary>
|
||
/// <param name="filePath"></param>
|
||
/// <returns></returns>
|
||
public static string ReplacePathSymbol(string filePath)
|
||
{
|
||
return new StringBuilder(filePath).Replace("//", "/").Replace('\\', '/').ToString();
|
||
}
|
||
|
||
/// <summary>
|
||
/// 获取unity中指定路径中的所有文件,可选择忽略指定文件夹中文件
|
||
/// </summary>
|
||
/// <param name="dirctoryPath"></param>
|
||
/// <param name="allFiles"></param>
|
||
/// <param name="removePath"></param>
|
||
public static void GetAllFile(string dirctoryPath, ref List<string> allFiles, string removePath = null)
|
||
{
|
||
if (Directory.Exists(dirctoryPath))
|
||
{
|
||
string[] allFiles1 = Directory.GetFiles(dirctoryPath);
|
||
for (int i = 0; i < allFiles1.Length; i++)
|
||
{
|
||
if (!allFiles1[i].EndsWith(".meta"))
|
||
{
|
||
string filePathName = allFiles1[i];
|
||
filePathName = ReplacePathSymbol(filePathName);
|
||
allFiles.Add(filePathName);
|
||
}
|
||
|
||
}
|
||
string[] allDirctory = Directory.GetDirectories(dirctoryPath);
|
||
if (allDirctory.Length > 0)
|
||
{
|
||
for (int j = 0; j < allDirctory.Length; j++)
|
||
{
|
||
string filePathName = FileManager.EraseExtension(allDirctory[j]);
|
||
filePathName = ReplacePathSymbol(filePathName);
|
||
if (removePath != null)
|
||
{
|
||
// Debug.LogError(fileName);
|
||
string fileName = filePathName.Substring(filePathName.LastIndexOf("/") + 1);
|
||
|
||
if (fileName == removePath)
|
||
continue;
|
||
}
|
||
GetAllFile(filePathName, ref allFiles, removePath);
|
||
}
|
||
}
|
||
}
|
||
|
||
}
|
||
|
||
|
||
/// <summary>
|
||
/// 获取路径中指定扩展名的所有文件
|
||
/// </summary>
|
||
/// <param name="dirctoryPath"></param>
|
||
/// <param name="extensionName"></param>
|
||
/// <param name="allFiles"></param>
|
||
public static void GetAllocateFile(string dirctoryPath, string extensionName, ref List<string> allFiles)
|
||
{
|
||
if (Directory.Exists(dirctoryPath))
|
||
{
|
||
string[] allFiles1 = Directory.GetFiles(dirctoryPath);
|
||
for (int i = 0; i < allFiles1.Length; i++)
|
||
{
|
||
if (allFiles1[i].EndsWith(extensionName))
|
||
{
|
||
string filePathName = allFiles1[i];
|
||
filePathName = ReplacePathSymbol(filePathName);
|
||
allFiles.Add(filePathName);
|
||
}
|
||
|
||
}
|
||
|
||
string[] allDirctory = Directory.GetDirectories(dirctoryPath);
|
||
if (allDirctory.Length > 0)
|
||
{
|
||
for (int j = 0; j < allDirctory.Length; j++)
|
||
{
|
||
string filePathName = FileManager.EraseExtension(allDirctory[j]);
|
||
filePathName = ReplacePathSymbol(filePathName);
|
||
GetAllocateFile(filePathName, extensionName, ref allFiles);
|
||
}
|
||
}
|
||
|
||
}
|
||
}
|
||
|
||
|
||
|
||
/// <summary>
|
||
/// 分割字符串
|
||
/// </summary>
|
||
/// <param name="str"></param>
|
||
/// <param name="splitStr"></param>
|
||
/// <param name="callBack"></param>
|
||
public static void StringSplit(string str,string splitStr,Action<string[]> callBack)
|
||
{
|
||
string[] splitList= str.Trim().Split(splitStr.ToCharArray());
|
||
if (callBack!=null)
|
||
callBack(splitList);
|
||
}
|
||
|
||
|
||
/// <summary>
|
||
/// 获取路径中的所有文件夹列表
|
||
/// </summary>
|
||
/// <param name="directoryPath"></param>
|
||
/// <param name="directoryHierarchyList"></param>
|
||
public static void GetAllDirectoryHierarchyByPath(string directoryPath,ref List<string> directoryHierarchyList)
|
||
{
|
||
int pos = directoryPath.IndexOf("/");
|
||
if (pos>=0)
|
||
{
|
||
string tempDir = directoryPath.Substring(0, pos);
|
||
directoryHierarchyList.Add(tempDir);
|
||
tempDir = directoryPath.Substring(pos+1);
|
||
GetAllDirectoryHierarchyByPath(tempDir,ref directoryHierarchyList);
|
||
}
|
||
else
|
||
{
|
||
directoryHierarchyList.Add(directoryPath);
|
||
return;
|
||
}
|
||
|
||
|
||
}
|
||
|
||
|
||
public static byte[] Encrypt(byte[] text, string key)
|
||
{
|
||
byte[] keyData = System.Text.UTF8Encoding.UTF8.GetBytes(key);
|
||
for (int i = 0; i < text.Length; i++)
|
||
{
|
||
for (int j = 0; j < keyData.Length; j++)
|
||
{
|
||
text[i] = (byte)(text[i]^ keyData[j]);
|
||
}
|
||
|
||
}
|
||
return text;
|
||
}
|
||
|
||
|
||
|
||
|
||
|
||
|
||
|
||
|
||
|
||
}
|