using System; using System.Collections; using System.Collections.Generic; using System.IO; using System.Text; using System.Text.RegularExpressions; using UnityEngine; namespace GFGEditor { public class FileUtil { public static bool CheckPathInParent(string path, string parent) { path = path.Replace('\\', '/'); path = path + "/"; parent = parent.Replace('\\', '/'); parent = parent + "/"; parent = Regex.Replace(parent, "//", "/"); return path.Contains(parent); } /// /// /// /// /// ,路径比须从Asset起,例如"Assets/Res/Effect" /// public static void ForeachFileInDir(string dirPath, List excludeDirs, Action action) { List excludeDirPaths = new List(); if (excludeDirs != null) { foreach (var excDir in excludeDirs) { var t = Environment.CurrentDirectory + "/" + excDir; t = t.Replace('\\', '/'); excludeDirPaths.Add(t); } } var t1 = dirPath.Replace('\\', '/'); if (Directory.Exists(dirPath) && !excludeDirPaths.Contains(t1)) { var files = Directory.GetFiles(dirPath); var dirs = Directory.GetDirectories(dirPath); foreach (var file in files) { action?.Invoke(file); } foreach (var dir in dirs) { ForeachFileInDir(dir, excludeDirs, action); } } } public static void ForeachDirInDir(string dirPath, Action action) { if (Directory.Exists(dirPath)) { var dirs = Directory.GetDirectories(dirPath); foreach (var dir in dirs) { action?.Invoke(dir); } } } public static List CopyFilesTo(string sourcePath, string targetPath, string saveName, string[] includeExtensionNames = null, string regular = null) { List result = new List(); if (Directory.Exists(sourcePath)) { var files = Directory.GetFiles(sourcePath); var dirs = Directory.GetDirectories(sourcePath); Dictionary sourceImageMD5 = new Dictionary(); sourceImageMD5 = ImagesClip.ReadSourceImagesMD5(saveName); foreach (var file in files) { var fileName = Path.GetFileName(file); if (fileName.Trim() == fileName && CheckStringByRegular(fileName, regular)) { string extensionName = Path.GetExtension(file); if (includeExtensionNames == null || Array.IndexOf(includeExtensionNames, extensionName) >= 0) { string targetFilePath = targetPath + fileName; if (!File.Exists(targetFilePath) || !Equals(file, targetFilePath)) { if (!sourceImageMD5.ContainsKey(file) || sourceImageMD5[file] != FileUtil.md5file(file)) { sourceImageMD5[file] = FileUtil.md5file(file); } File.Copy(file, targetFilePath, true); result.Add(file); } } } else { Debug.LogError($"请检查文件名 {file}"); } } foreach (var dir in dirs) { List tempResult = CopyFilesTo(dir, targetPath, saveName, includeExtensionNames, regular); result.AddRange(tempResult); } ImagesClip.WriteSourceImagesMD5(sourceImageMD5, saveName); } return result; } public static bool CheckStringByRegular(string str, string regular) { str = Path.GetFileNameWithoutExtension(str); if (regular == null)//不进行正则检测 { return true; } if (System.Text.RegularExpressions.Regex.IsMatch(str, regular)) { return true; } return false; } public static List CopyDirsAndFilesInSubDirTo(string sourcePath, string targetPath, string[] excludeExtensionNames = null, string regular = null) { List result = new List(); if (Directory.Exists(sourcePath)) { var dirs = Directory.GetDirectories(sourcePath); foreach (var dir in dirs) { var dirName = Path.GetFileName(dir); var currTargetPath = targetPath + dirName + "/"; if (!CheckStringByRegular(dirName, regular)) continue; if (!Directory.Exists(currTargetPath)) { Directory.CreateDirectory(currTargetPath); } List tempResult = CopyFilesAndDirsTo(dir, currTargetPath, excludeExtensionNames); result.AddRange(tempResult); } } return result; } public static List CopyFilesAndDirsTo(string sourcePath, string targetPath, string[] excludeExtensionNames = null) { List result = new List(); if (Directory.Exists(sourcePath)) { var files = Directory.GetFiles(sourcePath); var dirs = Directory.GetDirectories(sourcePath); foreach (var file in files) { var fileName = Path.GetFileName(file); if (fileName.Trim() == fileName) { string extensionName = Path.GetExtension(file); if (!FileNameContainsArrayElement(fileName, excludeExtensionNames)) { string targetFilePath = targetPath + fileName; if (!File.Exists(targetFilePath) || !Equals(file, targetFilePath)) { File.Copy(file, targetFilePath, true); result.Add(file); } } } else { Debug.LogError($"请检查文件名 {file}"); } } foreach (var dir in dirs) { var dirName = Path.GetFileName(dir); var currTargetPath = targetPath + dirName + "/"; if (!Directory.Exists(currTargetPath)) { Directory.CreateDirectory(currTargetPath); } List tempResult = CopyFilesAndDirsTo(dir, currTargetPath, excludeExtensionNames); result.AddRange(tempResult); } } return result; } public static string md5file(string file) { try { FileStream fs = new FileStream(file, FileMode.Open, FileAccess.Read); System.Security.Cryptography.MD5 md5 = new System.Security.Cryptography.MD5CryptoServiceProvider(); byte[] retVal = md5.ComputeHash(fs); fs.Close(); StringBuilder sb = new StringBuilder(); for (int i = 0; i < retVal.Length; i++) { sb.Append(retVal[i].ToString("x2")); } return sb.ToString(); } catch (Exception ex) { throw new Exception("md5file() fail, error:" + ex.Message); } } public static bool Equals(string fileA, string fileB) { return md5file(fileA) == md5file(fileB); } public static bool FileNameContainsArrayElement(string fileName, string[] excludeExtensionNames = null) { if (excludeExtensionNames != null) { foreach (var item in excludeExtensionNames) { if (fileName.Contains(item)) { return true; } } } return false; } public static void DeleteUnnecessaryImage(string targetPath, string saveName = "") { if (saveName != "") { DeleteUnnecessaryImageRes(targetPath, saveName); DeleteUnnecessaryImageMD5(saveName); } if (targetPath == ImportArtResTool.DressUpTargetPath) { DeleteUnnecessaryImagePos(ImportArtResTool.DressUpTargetPath); // DeleteUnnecessaryImageMD5(ImportArtResTool.DressUpMd5FileSaveName); } Debug.Log(targetPath + "清除完成"); } //清除无资源的Md5数据 public static void DeleteUnnecessaryImageMD5(string saveName) { List rKeys = new List(); Dictionary sourceResMD5 = new Dictionary(); sourceResMD5 = ImagesClip.ReadSourceImagesMD5(saveName); ICollection keys = sourceResMD5.Keys; foreach (string key in keys) { if (!File.Exists(key)) { rKeys.Add(key); } } for (int i = 0; i < rKeys.Count; i++) { sourceResMD5.Remove(rKeys[i]); } ImagesClip.WriteSourceImagesMD5(sourceResMD5, saveName); } public static void DeleteUnnecessaryImageRes(string targetPath, string saveName) { string[] includeExtensionNames = new string[] { ".png", ".jpg" }; if (!Directory.Exists(targetPath)) { Debug.Log(targetPath + "不存在!!!!!"); return; } var files = Directory.GetFiles(targetPath); foreach (var file in files) { if (file.Trim() != file) { Debug.LogError($"请检查文件名 {file}"); continue; } string fileName = Path.GetFileName(file); Dictionary sourceResMD5 = new Dictionary(); sourceResMD5 = ImagesClip.ReadSourceImagesMD5(saveName); ICollection keys = sourceResMD5.Keys; foreach (string key in keys) { if (!File.Exists(key)) { string sourceName = Path.GetFileName(key); string targetFilePath = targetPath + fileName; if (sourceName == fileName) { File.Delete(targetFilePath); } } } } Debug.Log(targetPath + "清除完成!"); } //清除冗余位置文件 public static void DeleteUnnecessaryImagePos(string targetPath) { string[] includeExtensionNames = new string[] { ".png", ".jpg" }; var files = Directory.GetFiles(targetPath); foreach (var file in files) { if (file.Trim() != file) { Debug.LogError($"请检查文件名 {file}"); continue; } string extensionName = Path.GetExtension(file); string fileName = Path.GetFileName(file).Split('.')[0]; ; string targetFilePath = targetPath + fileName; if (extensionName == ".bytes" && !File.Exists(targetFilePath + includeExtensionNames[0]) && !File.Exists(targetFilePath + includeExtensionNames[1])) { File.Delete(targetPath + Path.GetFileName(file)); } } Debug.Log("位置文件清除完成!"); } public static void DeleteUnnecessaryAnimation(string localDir, string sourceDirs) { if (Directory.Exists(localDir)) { var localFiles = Directory.GetFiles(localDir); var localDirs = Directory.GetDirectories(localDir); var souFiles = Directory.GetFiles(sourceDirs); var souDirs = Directory.GetDirectories(sourceDirs); foreach (var lfile in localFiles) { var lfileName = Path.GetFileName(lfile); bool existFile = false; foreach (var sfile in souFiles) { var sfileName = Path.GetFileName(sfile); if (lfileName == sfileName) { existFile = true; break; } } if (!existFile) { File.Delete(lfile); } } foreach (var lDir in localDirs) { string lDirName = Path.GetFileName(lDir); bool needDelete = false; foreach (var sDir in souDirs) { string sDirName = Path.GetFileName(sDir); if (lDirName == sDirName) { needDelete = true; DeleteUnnecessaryAnimation(lDir, sDir); } } if (!needDelete) { Directory.Delete(lDir, true); } } } } } }