private Chunk RegisterChunk(int Start, int Length, int Id = 0)
        {
            if (Id == 0)
            {
                Id = GetNewChunkID();
            }
            Chunk NewChunk = new Chunk(Start, Length, 0, Id);

            EmptyChunks.Add(NewChunk.Id, NewChunk);
            EmptyChunksStart.Add(NewChunk.Start, NewChunk);
            EmptyChunksLength.Add(NewChunk.Length, NewChunk);
            return(NewChunk);
        }
        private Chunk GetNewChunk(int DataLength)
        {
            Logger.Debug($"M: GET NEW CHUNK");
            int ChunkId     = GetNewChunkID();
            int ChunkStart  = GetEndOfArchive();
            int ChunkLength = DataLength;

            SetEndOfArchive(ChunkStart + ChunkLength);
            Chunk NewChunk = new Chunk(ChunkStart, ChunkLength, 0, ChunkId);

            EmptyChunks.Add(ChunkId, NewChunk);
            return(NewChunk);
        }
        public void MarkChunkAsEmpty(int ChunkId, int FileId)
        {
            Logger.Debug($"M: MARK CHUNK {ChunkId} AS NOT WRITTEN BY {FileId}");
            Chunk Chunk = GetChunkByIdInternal(ChunkId);

            Chunk.SetNotWritten();
            if (!(Files.ContainsKey(FileId)))
            {
                throw new FileNotFoundException($"File {FileId} not found in Metadata");
            }
            Files[FileId].DeleteChunk(ChunkId);
            if (!(Chunk.IsWritten()))
            {
                if (WrittenChunks.ContainsKey(Chunk.Id))
                {
                    WrittenChunks.Remove(Chunk.Id);
                }
                try
                {
                    Chunk PreChunk = GetChunkBeforIfEmpty(Chunk);
                    Chunk = CombineChunks(PreChunk, Chunk);
                }
                catch (ChunkNotFoundException)
                {
                }
                try
                {
                    Chunk AfterChunk = GetChunkAfterIfEmpty(Chunk);
                    Chunk = CombineChunks(Chunk, AfterChunk);
                }
                catch (ChunkNotFoundException)
                {
                }
                if (!(EmptyChunks.ContainsKey(Chunk.Id)))
                {
                    EmptyChunks.Add(Chunk.Id, Chunk);
                    EmptyChunksStart.Add(Chunk.Start, Chunk);
                    EmptyChunksLength.Add(Chunk.Length, Chunk);
                }
            }
        }