public KXTUCCacheFile
        (
            string path,
            Action <LogLevel, string> notify,
            bool chat_type = FriendType
        )
        {
            Invaild   = false;
            VisitTime = DateTime.Now;

            Notify   = notify;
            ChatType = chat_type;

            Stream = new FileStream(path, FileMode.Open, FileAccess.ReadWrite);

            byte[] buffer = new byte[KXTUserChatHead.KXTUserChatHeadLength];
            Stream.Read(buffer, 0, buffer.Length);

            Write       = KXTUserChatHead.Parse(buffer);
            RequestList = new Dictionary <Guid, KXTUserChatHead>();

            ReadLock  = 0;
            WriteLock = 0;

            SaveTimes = 0;
        }
        public void AddGroup(string group_id)
        {
            FileStream stream = File.Create(RootDirectory + "\\Groups\\" + group_id + ".kxtchat");

            KXTUserChatHead head = new KXTUserChatHead
            {
                EndRecorder  = 0,
                RecorderSize = 0
            };

            stream.Write(head.ToByteArray(), 0, KXTUserChatHead.KXTUserChatHeadLength);
            stream.Flush();
            stream.Close();
        }
        public static KXTUserChatHead Parse(byte[] buffer)
        {
            KXTUserChatHead head = new KXTUserChatHead();

            try
            {
                head.EndRecorder  = BitConverter.ToInt64(buffer, 0);
                head.RecorderSize = BitConverter.ToInt32(buffer, 8);
            }
            catch
            {
            }

            return(head);
        }
        public bool AddFriend(string userA, string userB)
        {
            if (DBReader.NewRelation(userA, userB, out string relation_id))
            {
                FileStream stream = File.Create(RootDirectory + "\\Relations\\" + relation_id + ".kxtchat");

                KXTUserChatHead head = new KXTUserChatHead
                {
                    EndRecorder  = 0,
                    RecorderSize = 0
                };

                stream.Write(head.ToByteArray(), 0, KXTUserChatHead.KXTUserChatHeadLength);
                stream.Flush();
                stream.Close();

                return(true);
            }

            return(false);
        }
        public void Read(Guid request_id, out ChatPackage[] chats)
        {
            ToLockRead();

            VisitTime = DateTime.Now;
            Invaild   = false;

            List <ChatPackage> buffer = new List <ChatPackage>();

            KXTUserChatHead value;

            if (!RequestList.TryGetValue(request_id, out value))
            {
                ToLockWrite();

                value = new KXTUserChatHead
                {
                    EndRecorder  = Write.EndRecorder,
                    RecorderSize = Write.RecorderSize
                };

                ToUnLockWrite();

                RequestList.Add(request_id, value);
            }

            for (int i = 0; i < 10; ++i)
            {
                if (0 == value.EndRecorder)
                {
                    break;
                }

                byte[] temp = new byte[value.RecorderSize];

                Stream.Position = value.EndRecorder;
                Stream.Read(temp, 0, temp.Length);

                KXTUserChatItem item = KXTUserChatItem.Parse(temp);
                value.EndRecorder  = item.PreRecorder;
                value.RecorderSize = item.PreSize;

                if (ChatType)
                {
                    buffer.Add(new FriendChatPackage
                    {
                        Message = item.Message,
                        Sender  = IKXTServer.DataConvert.GetString(item.Sender),
                        Time    = item.Time
                    });
                }
                else
                {
                    buffer.Add(new FriendChatPackage
                    {
                        Message = item.Message,
                        Sender  = IKXTServer.DataConvert.GetString(item.Sender),
                        Time    = item.Time
                    });
                }
            }

            ToUnLockRead();

            chats = buffer.ToArray();
        }