/// <summary> /// 刷新存档列表 /// </summary> public void RefreshArchiveList() { _lastArchives.Clear(); _lastArchives.AddRange(_allArchives); _allArchives.Clear(); foreach (var file in GetFiles()) { if (Path.GetExtension(file) == BaseConstMgr.Extention_Save) { string name = Path.GetFileNameWithoutExtension(file); DateTime fileTime = GetLastWriteTime(file); ArchiveFile <T> a = null; // 如果以前就存在这个存档的,而且修改时间符合,则使用以前的 a = _lastArchives.Find(ac => ac.Name == name && ac.FileTime == fileTime); if (a == null) { a = LoadArchive(name, false); } else { } _allArchives.Add(a); } } // 按时间排序 _allArchives.Sort((a1, a2) => - a1.SaveTime.CompareTo(a2.SaveTime)); _isArchiveListDirty = false; }
/// <summary> /// 加载存档 /// </summary> /// <param name="ID"></param> /// <param name="isReadContnet"></param> /// <returns></returns> public ArchiveFile <T> LoadArchive(string ID, bool isReadContnet) { string path = GetArchivePath(ID); ArchiveFile <T> archive = new ArchiveFile <T>(ID, CurArchiveVersion); archive.Load(path, ID, CurArchiveVersion, isReadContnet, GetLastWriteTime(path)); return(archive); }
/// <summary> /// 从运行中的游戏保存 /// </summary> public ArchiveFile <T> SaveFromRuntimeData(string ID, T GameData, bool isSetDirty = true, bool isHide = false) { ArchiveFile <T> archive = new ArchiveFile <T>(ID, CurArchiveVersion, default(DateTime), isHide); archive.Save(GameData, GetArchivePath(ID)); if (isSetDirty) { SetArchiveListDirty(); } return(archive); }
/// <summary> /// 存档是否可以载入 /// </summary> /// <param name="id"></param> /// <returns></returns> public bool IsArchiveValid(string id) { ArchiveFile <T> a = GetArchive(id); return(a != null && a.IsLoadble); }
// 载入存档 public void Load(string path, string name, int curVersion, bool isReadContent, DateTime fileTime) { ArchiveFile <T> archive = this; archive.Name = name; archive.curVersion = curVersion; archive.FileTime = fileTime; using (Stream stream = File.OpenRead(path)) { try { BinaryReader reader = new BinaryReader(stream); string headerStr = null; //使用try防止无效的存档 headerStr = reader.ReadString(); if (string.IsNullOrEmpty(headerStr)) { archive.IsBroken = true; } else { archive.Header = JsonUtility.FromJson <ArchiveHeader>(headerStr); int contentSize = archive.Header.ContentLength; if (contentSize <= 0) { archive.IsBroken = true; } else { archive.Content = reader.ReadBytes(contentSize); if (!string.IsNullOrEmpty(archive.Header.ContentHash)) { // 内容损坏 if (archive.Header.ContentHash != FileUtil.Hash(archive.Content)) { archive.IsBroken = true; return; } } if (isReadContent && archive.IsCompatible && contentSize > 0) { byte[] toBeDeserialized = null; if (archive.Header.IsCompressed) { toBeDeserialized = FileUtil.GZDecompressToBytes(archive.Content); } else { toBeDeserialized = archive.Content; } archive.GameDatas = SerializationUtility.DeserializeValue <T>(toBeDeserialized, DataFormat.Binary); } } } reader.Close(); } catch (Exception e) { archive.IsBroken = true; CLog.Error("读取存档{0}时出现异常:{1}, 因此认为是损坏的存档。", archive.Name, e.Message); } } return; }