System.Windows.Forms.DynamicFileByteProvider.DeleteBytes C# (CSharp) Method

DeleteBytes() public method

See IByteProvider.DeleteBytes for more information.
public DeleteBytes ( long index, long length ) : void
index long
length long
return void
        public void DeleteBytes(long index, long length)
        {
            try
            {
                long bytesToDelete = length;

                // Find the first block affected.
                long blockOffset;
                DataBlock block = GetDataBlock(index, out blockOffset);

                // Truncate or remove each block as necessary.
                while (bytesToDelete > 0)
                {
                    long blockLength = block.Length;
                    DataBlock nextBlock = block.NextBlock;

                    // Delete the appropriate section from the block (this may result in two blocks or a zero length block).
                    long count = Math.Min(bytesToDelete, blockLength - (index - blockOffset));
                    block.RemoveBytes(index - blockOffset, count);

                    if (block.Length == 0)
                    {
                        _dataMap.Remove(block);
                        if (_dataMap.FirstBlock == null)
                        {
                            _dataMap.AddFirst(new MemoryDataBlock(new byte[0]));
                        }
                    }

                    bytesToDelete -= count;
                    blockOffset += block.Length;
                    block = (bytesToDelete > 0) ? nextBlock : null;
                }
            }
            finally
            {
                _totalLength -= length;
                OnLengthChanged(EventArgs.Empty);
                OnChanged(EventArgs.Empty);
            }
        }

Usage Example

        private void btnRemoveWord_Click(object sender, EventArgs e)
        {
            long offset = Position.RoundDown(4);
            long index  = offset / 4;

            DynamicFileByteProvider d = hexBox1.ByteProvider as DynamicFileByteProvider;

            d._supportsInsDel = true;
            d.DeleteBytes(offset, 4);
            d._supportsInsDel = false;

            _relocations.RemoveAt((int)index);
            foreach (ModuleDataNode s in ((ModuleNode)_section.Root).Sections)
            {
                foreach (Relocation r in s.Relocations)
                {
                    FixRelocation(r, -1, offset);
                }
            }

            for (int i = (int)index; i < _relocations.Count; i++)
            {
                _relocations[i]._index--;
            }

            PosChanged();
        }