Unity批量生成zip文件
下面展示一些 内联代码片
。
using Sirenix.OdinInspector;
using System.IO;
using System.Text;
using UnityEngine;
/// <summary>
/// 根据主配置自动添加Configs文件并清理无用Manifest文件
/// </summary>
public class AutoAddConfigs : MonoBehaviour
{
[SerializeField, Title("AB包输出路径", "与AssetBundle Browser中的一致")]
private string m_AssetBundleOutputPath = @"C:/NetBox2/Pack/WebGL";
public string AssetBundleOutputPath => m_AssetBundleOutputPath;
//[SerializeField, Title("需要批量转换成UTF8的文件夹路径")]
private string m_NeedChangeUTF8Dir = @"C:/Users/Admin/Downloads/海洋淡水生物";
// 针对海洋给定的文本介绍制作
//[Button("转为UTF-8,并自动格式化")]
private void ChangeToUTF8()
{
HandleDirectory(m_NeedChangeUTF8Dir);
//string content = File.ReadAllText(path, Encoding.GetEncoding("gb2312"));
//Debug.Log(content);
//File.WriteAllText(path, content, Encoding.UTF8);
}
private void HandleDirectory(string dirPath)
{
DirectoryInfo directoryInfo = new DirectoryInfo(dirPath);
HandleFiles(dirPath);
foreach (var directory in directoryInfo.GetDirectories())
{
//Debug.Log(directory.FullName);
HandleDirectory(directory.FullName);
}
}
private void HandleFiles(string filePath)
{
DirectoryInfo directoryInfo = new DirectoryInfo(filePath);
foreach (var file in directoryInfo.GetFiles())
{
if (file.FullName.EndsWith("csv") == false)
{
continue;
}
//Debug.Log(file.FullName);
string content;
if (GetTextFileEncodingType(file.FullName).Equals(Encoding.UTF8))
{
content = File.ReadAllText(file.FullName, Encoding.Default);
}
else
{
content = File.ReadAllText(file.FullName, Encoding.GetEncoding("gb2312"));
}
string newContent = HandleContent(content);
Debug.Log(file.Name + " 处理完毕");
File.WriteAllText(file.FullName, newContent, Encoding.UTF8);
}
}
private string HandleContent(string content)
{
string result = content;
result = result.Replace("\r\n", "/n");
result = result.Replace("\n", "/n");
result = result.Replace("简介/n ,", "简介\r\n0,");
result = result.Replace("\"中文学名", "中文学名");
result = result.Replace("\" 中文学名", "中文学名");
result = result.Replace("\"/n", "");
result = result.Replace("标本采集地:/n", "标本采集地:/n/t");
result = result.Replace("详细介绍:/n", "详细介绍:/n/t");
result = result.Replace("外形体征:/n", "外形体征:/n/t");
result = result.Replace("外部形态:/n", "外部形态:/n/t");
result = result.Replace("形态特征:/n", "形态特征:/n/t");
result = result.Replace("形态结构:/n", "形态结构:/n/t");
result = result.Replace("结构特征:/n", "结构特征:/n/t");
result = result.Replace("生活习性:/n", "生活习性:/n/t");
result = result.Replace("生存习性:/n", "生存习性:/n/t");
result = result.Replace("生态习性:/n", "生态习性:/n/t");
result = result.Replace("分布范围:/n", "分布范围:/n/t");
result = result.Replace("地理分布:/n", "地理分布:/n/t");
result = result.Replace("基本资料:/n", "基本资料:/n/t");
result = result.Replace("文化意义:/n", "文化意义:/n/t");
result = result.Replace("物种简介:/n", "物种简介:/n/t");
result = result.Replace("物种介绍:/n", "物种介绍:/n/t");
result = result.Replace("繁殖季节:/n", "繁殖季节:/n/t");
return result;
}
/// <summary>
/// 获取文本文件的字符编码类型
/// </summary>
private static Encoding GetTextFileEncodingType(string fileName)
{
Encoding encoding = Encoding.Default;
FileStream fileStream = new FileStream(fileName, FileMode.Open, FileAccess.Read);
BinaryReader binaryReader = new BinaryReader(fileStream, encoding);
byte[] buffer = binaryReader.ReadBytes((int)fileStream.Length);
binaryReader.Close();
fileStream.Close();
if (buffer.Length >= 3 && buffer[0] == 239 && buffer[1] == 187 && buffer[2] == 191)
{
encoding = Encoding.UTF8;
}
else if (buffer.Length >= 3 && buffer[0] == 254 && buffer[1] == 255 && buffer[2] == 0)
{
encoding = Encoding.BigEndianUnicode;
}
else if (buffer.Length >= 3 && buffer[0] == 255 && buffer[1] == 254 && buffer[2] == 65)
{
encoding = Encoding.Unicode;
}
else if (IsUTF8Bytes(buffer))
{
encoding = Encoding.UTF8;
}
return encoding;
}
/// <summary>
/// 判断是否是不带 BOM 的 UTF8 格式
/// BOM(Byte Order Mark),字节顺序标记,出现在文本文件头部,
/// Unicode编码标准中用于标识文件是采用哪种格式的编码。
/// </summary>
private static bool IsUTF8Bytes(byte[] data)
{
int charByteCounter = 1; //计算当前正分析的字符应还有的字节数
byte curByte; //当前分析的字节.
for (int i = 0; i < data.Length; i++)
{
curByte = data[i];
if (charByteCounter == 1)
{
if (curByte >= 0x80)
//判断当前
while (((curByte <<= 1) & 0x80) != 0)
{
charByteCounter++;
}
//标记位首位若为非0 则至少以2个1开始 如:110XXXXX...........1111110X
if (charByteCounter == 1 || charByteCounter > 6)
{
return false;
}
}
}
else
{
//若是UTF-8 此时第一位必须为1
if ((curByte & 0xC0) != 0x80)
{
return false;
}
charByteCounter--;
}
}
if (charByteCounter > 1)
{
throw new System.Exception("非预期的byte格式");
}
return true;
}
}
下面展示一些 内联代码片
。
/// <summary>
/// 批量生成zip文件
/// </summary>
[MenuItem("Assets/6批量生成zip文件", false, 6)]
private static void AutoAddZip()
{
AutoAddConfigs autoAddConfigs = GameObject.FindObjectOfType<AutoAddConfigs>();
string outputPath = "";
if (autoAddConfigs == null) return;
outputPath = autoAddConfigs.AssetBundleOutputPath + "/";
EditorUtility.DisplayProgressBar("处理中", "请耐心等待", 0f);
TextAsset[] allAssets = Selection.GetFiltered<TextAsset>(SelectionMode.DeepAssets);
float length = allAssets.Length;
for (int i = 0; i < allAssets.Length; i++)
{
TextAsset asset = allAssets[i];
string assetPath = AssetDatabase.GetAssetPath(asset);
string fullName = GetAssetFullNameByPath(assetPath);
if (fullName.Equals("Config.csv"))
{
// 处理压缩需要的路径
string startFolderPath = assetPath.Replace("Assets/", outputPath).Replace("/Config.csv", "");
string folderName = GetAssetFullNameByPath(startFolderPath);
startFolderPath = startFolderPath.Replace(folderName, folderName.ToLower());
string inputAndOutputPath = startFolderPath.Replace("/" + folderName.ToLower(), "");
//Debug.LogFormat("StartFolderPath: {0}", startFolderPath);
//Debug.LogFormat("FolderName: {0}", folderName.ToLower());
//Debug.LogFormat("InputAndOutputPath: {0}", inputAndOutputPath);
if (Directory.Exists(startFolderPath))
{
ZipTool.ZipFolder(inputAndOutputPath, folderName.ToLower());
}
}
EditorUtility.DisplayProgressBar("处理中", assetPath, i / length);
}
EditorUtility.ClearProgressBar();
Debug.Log("处理完毕");
}
/// <summary>
/// 获取包含后缀的名称(文件夹不包含)
/// </summary>
/// <param name="path">资源路径</param>
private static string GetAssetFullNameByPath(string path)
{
string[] temp = path.Split('/');
return temp[temp.Length - 1];
}
下面展示一些 内联代码片
。
using Ionic.Zip;
public class ZipTool
{
/// <summary>
/// 压缩文件夹,例如要压缩的文件夹路径为 C:/NetBox2/Pack/WebGL/Models/Version1/zhiwuxibaomo
/// </summary>
/// <param name="inputAndOutputPath">路径 C:/NetBox2/Pack/WebGL/Models/Version1</param>
/// <param name="folderName">输入文件夹名称和压缩后文件名称 zhiwuxibaomo</param>
public static void ZipFolder(string inputAndOutputPath, string folderName)
{
using (ZipFile zip = new ZipFile())
{
string dirPath = inputAndOutputPath + "/" + folderName;
zip.AddDirectory(dirPath, "./" + folderName);
zip.Save(inputAndOutputPath + "/" + folderName + ".zip");
}
}
}