public long Write(byte[] val)
        {
            var len = val.Length;
            var ret = free.Count > 0 ? free.Pop() : list.CreateItem();
            var pos = CreateItem(len);

            var itm = list[ret];

            itm->Position = pos;
            itm->Length   = len;

            var w = GetWriter();

            if (w.Position != pos)
            {
                w.Position = pos;
            }

            w.Write(val, 0, val.Length);
            w.Flush();

            poolWriters.ReleaseInstance(w);

            return(ret);
        }
        // Записываем буфер
        internal long WriteBuffer(long key, byte[] val)
        {
            long pos;
            var  ret = 0l;

            // Режим обновления
            if (key > 0)
            {
                var itm = list[key];

                // Обновление
                if (itm->Length == val.Length)
                {
                    ret = key;
                    pos = itm->Position;

                    goto write;
                }

                // Удаление старого массива
                list.Remove(key);
            }

            var len = val.Length;

            // Такая сложность связанна с необходимостью повторного использования удаленных или свободных записей в каталоге
            ret = list.CreateItem(len, out pos);

            if (pos == 0)
            {
                pos = CreateItem(len);

                var itm = list[ret];

                itm->Position = pos;
                itm->Length   = len;
            }

write:

            var w = GetWriter();

            if (w.Position != pos)
            {
                w.Position = pos;
            }

            w.Write(val, 0, val.Length);
            w.Flush();

            poolWriters.ReleaseInstance(w);

            //Debug.WriteLine("Write pos:" + pos + ", len:" + val.Length);

            return(ret);
        }