Example #1
0
        /// <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;
        }
Example #2
0
        /// <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);
        }
Example #3
0
        /// <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);
        }
Example #4
0
        /// <summary>
        /// 存档是否可以载入
        /// </summary>
        /// <param name="id"></param>
        /// <returns></returns>
        public bool IsArchiveValid(string id)
        {
            ArchiveFile <T> a = GetArchive(id);

            return(a != null && a.IsLoadble);
        }
Example #5
0
        // 载入存档
        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;
        }