/// <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); } }
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); }
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); } }
/// <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); }
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); }
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); }
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); }
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); }
/// <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); } }
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); }
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); } }
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); } }
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); }
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); }