【Unity批量生成zip文件】

此篇博客介绍了如何使用Unity的AutoAddConfigs脚本,自动检测指定目录下非UTF-8的CSV文件,统一转换为UTF-8格式,并将相关配置文件打包成AssetBundle。过程包括读取文件、内容处理和压缩文件到zip。
摘要由CSDN通过智能技术生成

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");
        }
    }
}
  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值