예제 #1
0
        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;
        }
예제 #2
0
        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);
        }
예제 #3
0
        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;
        }