/// <summary>
 /// Change current bulk to bulk with index
 /// </summary>
 /// <param name="index">bulk index in pool</param>
 private void changeBulk(int index)
 {
     if (currentIndex != index)
     {
         Pool[currentIndex] = currentBulk;
         currentBulk        = Pool[index];
         currentIndex       = index;
     }
 }
        //Public
        public InHardDriveCollection(int bufferSize)
        {
            _bufferSize = bufferSize;
            currentBulk = new Bulk <T>(_bufferSize);

            var formatter = new BinaryFormatter();
            var tp        = typeof(Bulk <T>);

            Pool = new DriveDictionary <int, Bulk <T> >(@"\tmp", formatter);
        }
        /// <summary>
        /// Перестройка контейнера.
        /// Например после удаления элемента из
        /// Или после вставки в контейнер
        /// </summary>
        /// <param name="indexFrom">индекс начиная с которого нужно перестраивать</param>
        /// <param name="indexExcept"></param>
        private void rebuildPool(int indexFrom, int indexExcept = -1)
        {
#if DEBUG
            Console.WriteLine("Rebuild Pool: ");
#endif
            if (currentIndex == Pool.Count - 1)
            {
                return;
            }
            for (int i = 0; i < Pool.Count; i++)
            {
                if (i == indexExcept)
                {
                    continue;
                }
                if (currentIndex + 1 != Pool.Count)
                {
                    //взять следующий Bulk с диска
                    Bulk <T> tmpBulk = Pool[currentIndex + 1];

                    //циклически перемещать лишний элемент в конец
                    if (currentBulk.Count > _bufferSize)
                    {
                        //взять из текущего bulk-а последний элемент и добавить в начало следующего
                        tmpBulk.Insert(0, currentBulk[currentBulk.Count - 1]);
                        currentBulk.RemoveAt(currentBulk.Count - 1);
                    }
                    //циклически сдвигать пустое место в конец
                    else
                    {
                        //взять из него первый элемент и добавить в конец текущего
                        currentBulk.Add(tmpBulk[0]);
                        tmpBulk.RemoveAt(0);
                    }

                    //положить текущий bulk на диск
                    Pool[currentIndex] = currentBulk;
                    currentBulk        = tmpBulk;
                    currentIndex++;
                }
            }
        }
 private void addBulk(Bulk <T> bulk)
 {
     Pool.Add(currentIndex, bulk);// new Bulk<T>(_bufferSize));//add bulk
     currentBulk = new Bulk <T>(_bufferSize);
     ++currentIndex;
 }