public static void BuildFileList(bool show_dialog)
    {
        Clear();

        DateTime dt1 = System.DateTime.UtcNow;
        // 获取AssetBundleManifest;
        string manifestPath          = string.Format("{0}/{1}", PackAssetBundle.bundleBuildFolder, ResourceConst.PkgBundleFolder);
        AssetBundleManifest manifest = PackBundleTools.GetAssetBundleManifest(manifestPath);

        if (manifest == null)
        {
            return;
        }

        // 计算总控文件;
        AddBundleInfo(ResourceConst.PkgBundleFolder, ref s_FileList);

        // 计算Config;
        AddConfInfo(s_FileList);

        // 计算其它文件;
        string[] allBundleKeyList = manifest.GetAllAssetBundles();
        for (int i = 0; i < allBundleKeyList.Length; i++)
        {
            string file = allBundleKeyList[i];
            if (string.IsNullOrEmpty(file))
            {
                continue;
            }
            AddBundleInfo(file, ref s_FileList);

            PackAssetBundleUtlis.ShowProgress(i, allBundleKeyList.Length, "计算MD5:", file);
        }
        EditorUtility.ClearProgressBar();

        string   strFileList = string.Format("{0}.txt", ResourceConst.FileListName);
        DateTime dt2         = System.DateTime.UtcNow;

        BuildCommon.WriteJsonToFile(PackAssetBundle.bundleBuildFolder, strFileList, s_FileList);

        FileDepencies.WriteMd5Info();

        DateTime dt3 = System.DateTime.UtcNow;

        BuildFileListAssetBundle(PackAssetBundle.bundleBuildFolder, strFileList, ResourceConst.FileListName);

        DateTime dt4 = System.DateTime.UtcNow;

        if (show_dialog)
        {
            string info = string.Format("FileList生成完成,总时长{0}秒", (dt4 - dt1).TotalSeconds.ToString("f1"));
            EditorUtility.DisplayDialog("打包完成", info, "好的");
        }
    }
    private static FileList ReadFileList(string path)
    {
        string fileName = System.IO.Path.GetFileName(path);

        if (string.Equals(fileName, ResourceConst.FileListName))
        {
            return(PackBundleTools.GetAssetBundleFileListFromAbsPath(path));
        }

        if (string.Equals(fileName, ResourceConst.FileListName + ".txt"))
        {
            return(BuildCommon.ReadJsonFromFile <FileList>(path));
        }

        return(null);
    }
    public static string CompareFileList(BundleUpdateMode mode = BundleUpdateMode.Update_CRC)
    {
        string old_FileListPath = string.Format("{0}/{1}", ResourceConst.BundleFolder, ResourceConst.FileListName);
        string new_fileListPath = string.Format("{0}/{1}", PackAssetBundle.bundleBuildFolder, ResourceConst.FileListName);

        if (!File.Exists(new_fileListPath) || !File.Exists(old_FileListPath))
        {
            return("1");
        }

        FileList new_fileList = PackBundleTools.GetAssetBundleFileList(new_fileListPath);
        FileList old_fileList = PackBundleTools.GetAssetBundleFileList(old_FileListPath);

        if (new_fileList == null || old_fileList == null)
        {
            return("2");
        }

        FileListCompareData compareData = FileList.Compare(new_fileList, old_fileList, true, mode);

        if (compareData == null)
        {
            return("3");
        }

        string update_size = Size2String(compareData.add_size + compareData.modifiy_size);
        string add_size    = Size2String(compareData.add_size);
        string mod_size    = Size2String(compareData.modifiy_size);
        string del_size    = Size2String(compareData.delete_size);

        string strInfo = string.Format("本地打包较上次需要更新{0}({1})", update_size, mode);

        strInfo = string.Format("{0}\n其中:\n增加:{1}", strInfo, add_size);
        strInfo = string.Format("{0}\n改变:{1}", strInfo, mod_size);
        strInfo = string.Format("{0}\n删除:{1}", strInfo, del_size);

        return(strInfo);
    }
    public static void DisposeFiles(string folder, string bundle)
    {
        List <string> abs = EditorCommon.GetAllFiles(folder, "*.ab");

        if (abs == null || abs.Count < 1)
        {
            return;
        }

        string path             = string.Format("{0}/{1}", folder, bundle);
        AssetBundleManifest abm = PackBundleTools.GetAssetBundleManifest(path);

        if (abm == null)
        {
            return;
        }

        string[] files = abm.GetAllAssetBundles();

        foreach (string file in files)
        {
            string bundlePath = string.Format("{0}/{1}", folder, file);
            if (abs.Contains(bundlePath))
            {
                abs.Remove(bundlePath);
            }
            //Debug.Log(file);
        }

        foreach (string ab in abs)
        {
            Debug.Log(ab);
            System.IO.File.Delete(ab);
            System.IO.File.Delete(string.Format("{0}.manifest", ab));
        }
    }
    public static void CopyAssetBundle(string src, string dest, string conf = "")
    {
        if (string.IsNullOrEmpty(src) || string.IsNullOrEmpty(dest))
        {
            return;
        }

        if (!Directory.Exists(src))
        {
            return;
        }

        string folderName = Path.GetFileName(src);

        dest = string.Format("{0}/{1}", dest, folderName);

        // 清除文件夹;
        FileUtils.ClearDirectory(dest);

        // 拷贝获取AssetBundleManifest文件;
        string topManifest = string.Format("{0}/{1}", src, folderName);

        CopyFile(topManifest, dest + "/" + folderName);

        // 拷贝FileList文件;
        string fileList    = string.Format("{0}/{1}", src, ResourceConst.FileListName);
        string newFileList = string.Format("{0}/{1}", dest, ResourceConst.FileListName);

        CopyFile(fileList, newFileList);

        // 拷贝Conf文件夹;
        if (!string.IsNullOrEmpty(conf))
        {
            string confFolder = string.Format("{0}/{1}", src, conf);
            CopyFolder(confFolder, dest);
        }

        // 拷贝gitlog和md5文件;
        CopyFile(string.Format("{0}/gitlog.txt", src), string.Format("{0}/gitlog.txt", dest));
        //CopyFile(string.Format("{0}/md5_info.txt", src), string.Format("{0}/md5_info.txt", dest));

        // 获取AssetBundleManifest;
        AssetBundleManifest manifest = PackBundleTools.GetAssetBundleManifest(topManifest);

        if (manifest == null)
        {
            return;
        }

        string[] allBundleKeyList = manifest.GetAllAssetBundles();
        for (int i = 0; i < allBundleKeyList.Length; i++)
        {
            string file = allBundleKeyList[i];
            if (string.IsNullOrEmpty(file))
            {
                continue;
            }

            string srcFile  = string.Format("{0}/{1}", src, file);
            string destFile = string.Format("{0}/{1}", dest, file);
            ShowProgress(i, allBundleKeyList.Length, "拷贝", file);
            CopyFile(srcFile, destFile);
        }
        EditorUtility.ClearProgressBar();
    }