public void Insert(byte[] buffer, int offset, int count) { /* * где логическая позиция, то есть где начиннается вставка? * если точно на начале span'а: * создаем новый span на memory stream и вставляем последний * перед первым * если внутри span'а (в том числе и на конце) * этот span разрываем на два * (logical_position-1 - конец первого, logical_position - начало второго), * создаем новый span на memory и вставляем его после разрыва * если logical_position==0, то есть в логическом начале * создаем memory span и вставляем его перед самым первым span'ом * если logical_position==Length, то есть вставка в логический конец * создаем memory span и вставляем его после самого последнего span'а * * в любом случае сначала создаем новый span дескриптор, * потом смотрим как его размезщать в span_list */ SpanDescriptor new_descr = create_memory_span(buffer, offset, count); if (Position == 0) { span_list.AddFirst(new_descr); } else if (Position == Length) { span_list.AddLast(new_descr); } else { LinkedListNode <SpanDescriptor> first_span = null; LinkedListNode <SpanDescriptor> second_span = null; span_split(Position, out first_span, out second_span); if (second_span != null) { span_list.AddBefore(second_span, new_descr); } else { throw new ArgumentOutOfRangeException("Position"); } } //подправим логическую длину length_logical += count; //и логическую позицию position_logical += count; }
private SpanDescriptor create_memory_span(byte[] buffer, int offset, int count) { var write_offset = stream_edits.Length; //ставим memory позицию на конец (а может и не надо) //stream_edits.Position = stream_edits.Length - 1; //записываем байты в поток stream_edits.Write(buffer, offset, count); //создаем дескриптор var ret = new SpanDescriptor (stream_edits, write_offset, count); return(ret); }
private void init_internal(string file_name) { this.stream_file_name = file_name; stream_file = FileSystemEx.WinAPiFSwrapper.CreateStreamEx (file_name, FileAccess.Read, FileShare.Read, FileMode.Open, netCommander.FileSystemEx.CreateFileOptions.RANDOM_ACCESS); var descr = new SpanDescriptor (stream_file, 0, stream_file.Length); span_list.Clear(); span_list.AddFirst(descr); stream_edits.Close(); stream_edits = new MemoryStream(); length_logical = stream_file.Length; }