Esempio n. 1
0
        /// <summary>
        /// 删除非当前版本使用的资源
        /// </summary>
        public void DeleteAllOldFile()
        {
            try
            {
                var allDirFiles = UnityPersistFileHelper.GetPersistAssetFileList(Dir, "*" + FileMapInfo.FileExtension);
                var needFiles   = new List <string>(FileInfo.AllFileMapInfo.Length);
                for (int i = 0; i < FileInfo.AllFileMapInfo.Length; i++)
                {
                    needFiles.Add(FileInfo.AllFileMapInfo[i].GetMappedFileName());
                }

                var allNeedDelFiles = new List <string>();
                foreach (var file in allDirFiles)
                {
                    if (!needFiles.Contains(file))
                    {
                        allNeedDelFiles.Add(file);
                    }
                }

                if (allNeedDelFiles.Count > 0)
                {
                    UnityPersistFileHelper.DeletePersistAssetFileList(Dir, allNeedDelFiles);
                }
            }
            catch (Exception e)
            {
                CommonLog.Error(e);
            }
        }
Esempio n. 2
0
        public static FileMapSystem CreateFromPersistAssetFile(string Dir)
        {
            var FileMap = new FileMapSystem(Dir);
            var bs      = UnityPersistFileHelper.ReadPersistAssetFileAllBytes(Dir, FileMap.FileMapInfoFileName);

            if (bs == null || bs.Length == 0)
            {
                return(null);
            }

            FileMap.InitFileMapInfo(bs);
            return(FileMap);
        }
Esempio n. 3
0
 public void ClearAllPersistDownloaded()
 {
     try
     {
         var allDirFiles = UnityPersistFileHelper.GetPersistAssetFileList(Dir, "*" + FileMapInfo.FileExtension);
         if (allDirFiles.Length > 0)
         {
             UnityPersistFileHelper.DeletePersistAssetFileList(Dir, new List <string>(allDirFiles));
         }
     }
     catch (Exception e)
     {
         CommonLog.Error(e);
     }
 }
Esempio n. 4
0
 /// <summary>
 /// 检查文件是否存在,检查顺序为Persist然后Stream
 /// </summary>
 /// <param name="dir"></param>
 /// <param name="path"></param>
 /// <param name="pos"></param>
 /// <returns></returns>
 public static bool IsFileExist(string dir, string fileName, out eFileLoaderPosType pos)
 {
     if (UnityPersistFileHelper.IsPersistAssetFileExist(dir, fileName))
     {
         pos = eFileLoaderPosType.PersistAsset;
         return(true);
     }
     if (UnityStreamingFileHelper.IsStreamAssetFileExist(dir, fileName))
     {
         pos = eFileLoaderPosType.StreamAsset;
         return(true);
     }
     pos = eFileLoaderPosType.None;
     return(false);
 }
Esempio n. 5
0
    public static AssetBundleCreateRequest ReadAssetBundleAsync(string dir, string fileName, ulong offset, out eFileLoaderPosType pos, uint crc = 0U)
    {
        var hasFile = IsFileExist(dir, fileName, out pos);

        if (hasFile)
        {
            if (pos == eFileLoaderPosType.PersistAsset)
            {
                return(UnityPersistFileHelper.ReadPersistAssetBundleAsync(dir, fileName, offset, crc));
            }
            if (pos == eFileLoaderPosType.StreamAsset)
            {
                return(UnityStreamingFileHelper.ReadStreamAssetBundleAsync(dir, fileName, offset, crc));
            }
        }
        return(null);
    }
Esempio n. 6
0
    public static byte[] ReadFileAllBytes(string dir, string fileName, int offset, int len, out eFileLoaderPosType pos)
    {
        var hasFile = IsFileExist(dir, fileName, out pos);

        if (hasFile)
        {
            if (pos == eFileLoaderPosType.PersistAsset)
            {
                return(UnityPersistFileHelper.ReadPersistAssetFileAllBytes(dir, fileName, offset, len));
            }
            if (pos == eFileLoaderPosType.StreamAsset)
            {
                return(UnityStreamingFileHelper.ReadStreamAssetFileAllBytes(dir, fileName, offset, len));
            }
        }
        return(null);
    }
Esempio n. 7
0
    public static Stream ReadFileByStream(string dir, string fileName, out eFileLoaderPosType pos, int offset = 0)
    {
        var hasFile = IsFileExist(dir, fileName, out pos);

        if (hasFile)
        {
            if (pos == eFileLoaderPosType.PersistAsset)
            {
                return(UnityPersistFileHelper.ReadPersistAssetFileByStream(dir, fileName, offset));
            }
            if (pos == eFileLoaderPosType.StreamAsset)
            {
                return(UnityStreamingFileHelper.ReadStreamAssetFileByStream(dir, fileName, offset));
            }
        }
        return(null);
    }
Esempio n. 8
0
    public static string ReadFileAllText(string dir, string fileName)
    {
        eFileLoaderPosType pos;
        var hasFile = IsFileExist(dir, fileName, out pos);

        if (hasFile)
        {
            if (pos == eFileLoaderPosType.PersistAsset)
            {
                return(UnityPersistFileHelper.ReadPersistAssetFileAllText(dir, fileName));
            }
            if (pos == eFileLoaderPosType.StreamAsset)
            {
                return(UnityStreamingFileHelper.ReadStreamAssetFileAllText(dir, fileName));
            }
        }
        return(null);
    }
Esempio n. 9
0
        /// <summary>
        /// 得到被映射后的文件名称,文件不存在返回空
        /// </summary>
        /// <param name="fileName"></param>
        /// <param name="pos"></param>
        /// <returns></returns>
        public string GetMappedFilePath(string fileName, out eFileMapperLoaderPosType pos)
        {
            pos = eFileMapperLoaderPosType.None;
            var info = GetFileInfo(fileName);

            if (info != null)
            {
                UnityFileLoaderHelper.eFileLoaderPosType filePos;
                var has = UnityFileLoaderHelper.IsFileExist(Dir, info.GetMappedFileName(), out filePos);
                if (filePos == UnityFileLoaderHelper.eFileLoaderPosType.PersistAsset)
                {
                    pos = eFileMapperLoaderPosType.MapperAsset_PersistAsset;
                    return(UnityPersistFileHelper.GetPersistAssetFilePath(Dir, info.GetMappedFileName()));
                }

                if (filePos == UnityFileLoaderHelper.eFileLoaderPosType.StreamAsset)
                {
                    pos = eFileMapperLoaderPosType.MapperAsset_StreamAsset;
                    return(UnityStreamingFileHelper.GetStreamAssetFilePath(Dir, info.GetMappedFileName()));
                }

                return(string.Empty);
            }
            else
            {
                UnityFileLoaderHelper.eFileLoaderPosType filePos;
                var has = UnityFileLoaderHelper.IsFileExist(Dir, fileName, out filePos);
                if (filePos == UnityFileLoaderHelper.eFileLoaderPosType.PersistAsset)
                {
                    pos = eFileMapperLoaderPosType.PersistAsset;
                    return(UnityPersistFileHelper.GetPersistAssetFilePath(Dir, fileName));
                }

                if (filePos == UnityFileLoaderHelper.eFileLoaderPosType.StreamAsset)
                {
                    pos = eFileMapperLoaderPosType.StreamAsset;
                    return(UnityStreamingFileHelper.GetStreamAssetFilePath(Dir, fileName));
                }

                return(string.Empty);
            }
        }
Esempio n. 10
0
    public long GetToDownloadSize()
    {
        long ret = 0;

        foreach (var downloadFileInfo in m_DownList)
        {
            var info = new FileInfo(
                UnityPersistFileHelper.GetPersistAssetFilePath(SavedDir, downloadFileInfo.FileName + TempExtension));
            if (info.Exists)
            {
                ret += downloadFileInfo.FileSize - info.Length;
            }
            else
            {
                ret += downloadFileInfo.FileSize;
            }
        }

        return(ret);
    }
Esempio n. 11
0
        public void DeletePersistFileByInfos(List <FileMapInfo> infos)
        {
            if (infos == null || infos.Count == 0)
            {
                return;
            }
            try
            {
                var needFiles = new List <string>(infos.Count);
                foreach (var info in infos)
                {
                    if (FileNameToMD5Name.ContainsKey(info.FileName))
                    {
                        needFiles.Add(info.FileName);
                    }
                }

                UnityPersistFileHelper.DeletePersistAssetFileList(Dir, needFiles);
            }
            catch (Exception e)
            {
                CommonLog.Error(e);
            }
        }
Esempio n. 12
0
    private void CheckMd5AndReplaceTempFile(RequestState myRequestState)
    {
        var ms = new MemoryStream();

        myRequestState.m_file_stream.Position = 0;
        myRequestState.m_file_stream.CopyTo(ms);
        var md5Struct = MD5Creater.GenerateMd5Code(ms.ToArray());

        myRequestState.m_file_stream.Close();
        ms.Dispose();

        var pathRoot = UnityPersistFileHelper.GetPersistAssetFilePath(SavedDir, "");


        if (md5Struct.MD51 == myRequestState.fileInfo.MapedFileName_MD51 &&
            md5Struct.MD52 == myRequestState.fileInfo.MapedFileName_MD52)
        {
            CommonLog.Log($"complete download file {myRequestState.fileInfo.FileName}");
            myRequestState.progress.RealCompletedSize -= myRequestState.downloadedSize;
            myRequestState.progress.RealCompletedSize +=
                myRequestState.fileInfo.FileSize; //myRequestState.fileSize;
            myRequestState.progress.UpdateProgress();

            FileUtils.RenameFile(pathRoot, myRequestState.fileInfo.FileName + TempExtension,
                                 myRequestState.fileInfo.FileName);
        }
        else
        {
            var tempFilePath = pathRoot + myRequestState.fileInfo.FileName + TempExtension;
            CommonLog.Error(MAuthor.WY,
                            $"file {myRequestState.fileInfo.FileName} md5 error, delete file {tempFilePath}");
            FileUtils.DeleteFile(tempFilePath);
            myRequestState.progress.SetException("md5 check failed",
                                                 WWWFileDownloader.eWWWErrorType.WriteFileError);
        }
    }
Esempio n. 13
0
    protected IEnumerator IDownloadAllFiles(List <DownloadFileInfo> files, DownloaderProgress outprogress)
    {
        long totalSize               = 0;
        long downloadedSize          = 0;
        List <DownloadFileInfo> list = new List <DownloadFileInfo>();

        for (int i = 0; i < files.Count; i++)
        {
            var info = files[i];
            totalSize += info.FileSize;

            if (UnityPersistFileHelper.IsPersistAssetFileExist(SavedDir, info.FileName))
            {
                downloadedSize += info.FileSize;
                continue;
            }

            list.Add(info);
        }

        outprogress.InitCompletedSize(totalSize, downloadedSize);

        List <KeyValuePair <DownloadFileInfo, UnityWebRequest> > tasks = new List <KeyValuePair <DownloadFileInfo, UnityWebRequest> >();

        for (int i = 0; i < list.Count; i++)
        {
            var bundleInfo = list[i];

            UnityWebRequest www;
            //我们的Bundle是基于Hash命名的,无需在意Cache
            www = new UnityWebRequest(GetAbsoluteUri(bundleInfo.FileName));
            www.downloadHandler = new DownloadHandlerBuffer();

            www.SendWebRequest();
            tasks.Add(new KeyValuePair <DownloadFileInfo, UnityWebRequest>(bundleInfo, www));

            while (tasks.Count >= this.MaxTaskCount || (i == list.Count - 1 && tasks.Count > 0))
            {
                //判断暂停
                while (outprogress.IsPause)
                {
                    yield return(new WaitForSeconds(0.1f));//WaitingForSecondConst.RWaitMS100;
                }

                if (outprogress.IsStop)
                {
                    yield break;
                }

                long tmpSize = 0;
                for (int j = tasks.Count - 1; j >= 0; j--)
                {
                    var             task        = tasks[j];
                    var             _bundleInfo = task.Key;
                    UnityWebRequest _www        = task.Value;

                    if (!_www.isDone)
                    {
                        tmpSize += Math.Max(0, (long)(_www.downloadProgress * _bundleInfo.FileSize));

                        continue;
                    }

                    tasks.RemoveAt(j);
                    downloadedSize += _bundleInfo.FileSize;
                    if (!string.IsNullOrEmpty(_www.error))
                    {
                        outprogress.SetException((_www.error), eWWWErrorType.DownloadNetError);

                        CommonLog.Error("Downloads File '{0}' failure from the address '{1}'.Reason:{2}", _bundleInfo.FileName, GetAbsoluteUri(_bundleInfo.FileName), _www.error);
                        yield break;
                    }

                    try
                    {
                        {
                            string fileName = _bundleInfo.FileName;
                            string tempName = new Guid().ToString() + ".download";

                            var pathRoot = UnityPersistFileHelper.GetPersistAssetFilePath(SavedDir, "");
                            //删了旧文件
                            FileUtils.DeleteFile(pathRoot + fileName);
                            //写到临时文件
                            FileUtils.WriteAllBytes(pathRoot + tempName, _www.downloadHandler.data);
                            //写完改名字
                            FileUtils.RenameFile(pathRoot, tempName, fileName);
                        }
                        if (resDownloadGcCounter++ >= resDownloadGcTriggerNum)
                        {
                            resDownloadGcCounter = 0;
                            GC.Collect();
                        }
                    }
                    catch (Exception e)
                    {
                        outprogress.SetException(e, eWWWErrorType.WriteFileError);
                        CommonLog.Error("Downloads File '{0}' failure from the address '{1}'.Reason:{2}", _bundleInfo.FileName, GetAbsoluteUri(_bundleInfo.FileName), e);
                        yield break;
                    }
                    finally
                    {
                        // 卸载资源
                        if (_www != null)
                        {
                            _www.Dispose();
                            _www = null;
                        }
                    }
                }

                outprogress.RealCompletedSize = downloadedSize + tmpSize;
                outprogress.UpdateProgress();

                yield return(new WaitForSeconds(0.1f));//WaitingForSecondConst.RWaitMS100;
            }
        }
        outprogress.SetRaw(null);
    }
Esempio n. 14
0
    private bool DownloadFile(RequestState myRequestState)
    {
        try
        {
            myRequestState.allDone.Reset();
            var pathRoot = UnityPersistFileHelper.GetPersistAssetFilePath(SavedDir, "");
            FileUtils.DeleteFile(pathRoot + myRequestState.fileInfo.FileName);

            if (Directory.Exists(pathRoot) == false)
            {
                Directory.CreateDirectory(pathRoot);
            }

            var tempName = myRequestState.fileInfo.FileName + TempExtension;
            myRequestState.m_file_stream =
                new FileStream(pathRoot + tempName, FileMode.OpenOrCreate, FileAccess.ReadWrite);
            var position = myRequestState.m_file_stream.Length;
            if (position < myRequestState.fileInfo.FileSize)
            {
                myRequestState.m_file_stream.Seek(position, SeekOrigin.Begin);
                var uri            = new Uri(GetAbsoluteUri(myRequestState.fileInfo.FileName));
                var httpWebRequest = (HttpWebRequest)WebRequest.Create(uri);
                httpWebRequest.Method           = "GET";
                httpWebRequest.KeepAlive        = true;
                httpWebRequest.ReadWriteTimeout = DefaultTimeout;
                httpWebRequest.AddRange(position);
                myRequestState.request = httpWebRequest;

                CommonLog.Log(MAuthor.WY, $"start Download {uri} from position {position}");
                var result =
                    httpWebRequest.BeginGetResponse(RespCallback, myRequestState);
                ThreadPool.RegisterWaitForSingleObject(result.AsyncWaitHandle, TimeoutCallback,
                                                       myRequestState, DefaultTimeout, true);

                bool waitDone;
                do
                {
                    waitDone = myRequestState.allDone.WaitOne(100);
                    myRequestState.progress.UpdateProgress();

                    //== TODO
                    if (stopAllDownload || myRequestState.progress.IsStop)
                    {
                        myRequestState.request.Abort();
                        myRequestState.response.Close();
                        myRequestState.streamResponse?.Close();
                        myRequestState.m_file_stream.Close();
                        return(false);
                    }
                } while (!waitDone);

                // Release the HttpWebResponse resource.
                myRequestState.response?.Close();
                myRequestState.streamResponse?.Close();
            }
            else
            {
                CheckMd5AndReplaceTempFile(myRequestState);
            }
        }
        catch (Exception ex)
        {
            myRequestState.m_file_stream?.Close();
            CommonLog.Error(MAuthor.WY,
                            $"download {myRequestState.fileInfo.FileName} cause exception {ex.Message}\n{ex.StackTrace}");
            myRequestState.progress.SetException(ex, WWWFileDownloader.eWWWErrorType.DownloadNetError);
            return(false);
        }

        return(true);
    }