美文网首页
persistentDataPath

persistentDataPath

作者: 醉酒青牛_fa4e | 来源:发表于2019-04-14 13:42 被阅读0次

由于项目已实现热更新,所以资源优先由沙盒读取,或完全直接从沙盒读取。为了防止在更新大版本时使用到旧项目的资源,所以需要对沙盒中旧的资源进行覆盖。
暂时实现了以下两种copy方案。

MD5文件格式与生成:

方法一:将本地资源一次性全部copy到沙盒,仅在首次安装或覆盖安装时对比oldfiles进行筛选覆盖
缺点:很慢。 30m资源耗时近20s,可优化:文件压缩后copy过去再解压。该方案暂时不用,仅做参考

private string oldfilesName = "oldfiles.txt";
private string filesName = "files.txt";

IEnumerator CopyFolder()
{
List<FileInfo> localInfos = new List<FileInfo>();
List<FileInfo> shaheInfos = new List<FileInfo>();
List<FileInfo> copyInfos = new List<FileInfo>();

    //本地oldfiles
    string src = getStreamingPath_for_www() + oldfilesName;
    WWW www = new WWW(src);
    yield return www;
    if (!string.IsNullOrEmpty(www.error))
    {
        Debug.Log("www.error:" + www.error);
    }
    else
    {
        StringReader reader = new StringReader(www.text);
        string line;
        while ((line = reader.ReadLine()) != null)
        {
            string[] temp = line.Split(‘|‘);
            string fileName = temp[0];
            string md5 = temp[1];
            int length = int.Parse(temp[2]);
            FileInfo info;
            info.fileName = fileName;
            info.md5 = md5;
            info.length = length;
            localInfos.Add(info);
        }
        reader.Dispose();
        reader.Close();
    }
    www.Dispose();

    if (localInfos.Count > 0)
    {
        //沙盒oldfiles
        string des = Application.persistentDataPath + "/" + oldfilesName;
        if (File.Exists(des))
        {
            StreamReader reader = File.OpenText(des);
            string line;
            while ((line = reader.ReadLine()) != null)
            {
                string[] temp = line.Split(‘|‘);
                string fileName = temp[0];
                string md5 = temp[1];
                int length = int.Parse(temp[2]);
                FileInfo info;
                info.fileName = fileName;
                info.md5 = md5;
                info.length = length;
                shaheInfos.Add(info);
            }
            reader.Dispose();
            reader.Close();
        }

        //需要更新oldfiles
        copyInfos = CompareFileInfo(localInfos, shaheInfos);
        foreach (var item in copyInfos)
        {
            //string  mfileName = item.fileName.Replace("\\","/");
            string _src = getStreamingPath_for_www() + item.fileName;
            string fileName = item.fileName.Substring(item.fileName.LastIndexOf(‘/‘) + 1);
            string _des = Application.persistentDataPath + "/" + fileName;
            //Debug.Log("des:" + _des);
            //Debug.Log("src:" + _src);
            WWW _www = new WWW(_src);
            yield return _www;
            if (!string.IsNullOrEmpty(_www.error))
            {
                Debug.Log("_www.error:" + _www.error);
            }
            else
            {
                FileStream stream = new FileStream(_des, FileMode.Create);
                stream.Write(_www.bytes, 0, _www.bytes.Length);
                stream.Flush();
                stream.Close();

            }
            _www.Dispose();
        }

        if (copyInfos.Count > 0)
        {
            //copy oldfiles
            StartCoroutine(copy(oldfilesName));

            //删除 file 和 version 
            //删除这两个文件是copy完之后让游戏重新进行一次热更新,以保证沙盒资                  源与资源服资源保持一致(也是避免新资源被copy而报错)
            string filepath = Application.persistentDataPath + "/files.txt";
            string versionpath = Application.persistentDataPath + "/Version";
            if (File.Exists(filepath))
            {
                File.Delete(filepath);
            }
            if (File.Exists(versionpath))
            {
                File.Delete(versionpath);
            }
        }

        Debug.logger.Log("文件复制完成:共" + copyInfos.Count + "个文件");
    }
    else
    {
        Debug.logger.Log("本地无文件:" + copyInfos.Count + "个文件");
    }

    StartCoroutine(compareVersion());

}


/// <summary>  
/// 将streaming path 下的文件copy到对应用  
/// 
IEnumerator copy(string fileName)
{
    string src = getStreamingPath_for_www() + fileName;
    string des = Application.persistentDataPath + "/" + fileName;
    //Debug.Log("des:" + des);
    //Debug.Log("src:" + src);
    WWW www = new WWW(src);
    yield return www;
    if (!string.IsNullOrEmpty(www.error))
    {
        Debug.Log("www.error:" + www.error);
    }
    else
    {
        if (File.Exists(des))
        {
            File.Delete(des);
        }
        FileStream fsDes = File.Create(des);
        fsDes.Write(www.bytes, 0, www.bytes.Length);
        fsDes.Flush();
        fsDes.Close();

    }
    www.Dispose();
}



//比较md5
List<FileInfo> CompareFileInfo(List<FileInfo> localInfos, List<FileInfo> shaheInfos)
{
    List<FileInfo> downloadList = new List<FileInfo>();
    for (int i = 0; i < localInfos.Count; i++)
    {
        FileInfo info = localInfos[i];
        bool flag = NeedCopy(info.fileName, info.md5, shaheInfos);
        if (flag)
        {
            downloadList.Add(info);
        }
    }
    return downloadList;
}

//true 需要下载,false 不用下载
bool NeedCopy(string fileName, string md5, List<FileInfo> shaheInfos)
{
    for (int i = 0; i < shaheInfos.Count; i++)
    {
        if (shaheInfos[i].fileName == fileName)
        {
            if (shaheInfos[i].md5 == md5)
            {
                return false;
            }
            else
            {
                return true;
            }
        }
    }
    return true;
}

string getStreamingPath_for_www()
{
    string pre = "file://";

if UNITY_EDITOR

    pre = "file://";

elif UNITY_ANDROID

    pre = "";  

elif UNITY_IPHONE

    pre = "file://";  

endif

    string path = pre + Application.streamingAssetsPath + "/";
    return path;
}

string getPersistentPath_for_www()
{
    string pre = "file://";

if UNITY_EDITOR || UNITY_STANDALONE_WIN

    pre = "file:///";

elif UNITY_ANDROID

    pre = "file://";  

elif UNITY_IPHONE

    pre = "file://";  

endif

    string path = pre + Application.persistentDataPath + "/";
    return path;
}

#endregion

相关文章

网友评论

      本文标题:persistentDataPath

      本文链接:https://www.haomeiwen.com/subject/btujwqtx.html