/// <summary> write self into stm with allocate pages with self </summary> public void Write(Stream stm) { var buff = header.DataHandler.Pack(pageAllocations.GetBytes()); var allocatedPages = stm.ReadPageSequence(header, FIRST_PA_PAGE).ToList(); var requiredPages = header.GetRequiredPages(buff.Length); while (requiredPages > allocatedPages.Count) { allocatedPages.AddRange(AllocatePages(requiredPages - allocatedPages.Count)); buff = header.DataHandler.Pack(pageAllocations.GetBytes()); // serialize to buffer and check again - need to more pages? requiredPages = header.GetRequiredPages(buff.Length); } stm.WriteIntoPages(header, buff, 0, allocatedPages.ToArray()); }
/// <summary> /// Write entries directory to pages. If pages not enough for new directory - additional pages will allocated. /// Also write header and pageAllocator state /// </summary> public void Write(Stream stm, PagedContainerHeader header, PageAllocator pageAllocator) { var targetPages = pages; var buff = entries.WriteEntries(header.DataHandler); var requiredPages = header.GetRequiredPages(buff.Length); if (requiredPages > targetPages.Length) // need to allocate additional pages? { targetPages = targetPages.Concat(pageAllocator.AllocatePages(requiredPages - targetPages.Length)).ToArray(); } else if (requiredPages < targetPages.Length) // can free unused pages? { var mustBeFreePages = targetPages.Skip(requiredPages).ToArray(); targetPages = targetPages.Take(requiredPages).ToArray(); pageAllocator.FreePages(mustBeFreePages); } stm.WriteIntoPages(header, buff, 0, targetPages); header.DirectoryFirstPage = targetPages[0]; header.Write(stm); pageAllocator.Write(stm); pages = targetPages; }