예제 #1
0
        /// <summary> Копирование из доп файла и получение следующий серии в файле-источнике
        /// </summary>
        /// <param name="destFirstFile">True, если следует копировать в первый вспомогательный файл
        /// false, если во второй </param>
        private void CopyAndNextSequence(bool destFirstFile)
        {
            if (_source.EndOfFile)
            {
                return;
            }
            var tmp = destFirstFile ? _otherOne : _otherTwo;

            Counter.Inc(ECounter.OfCompare, _source.CopySequence(tmp));
            ++Count;
            _source.NextSequence();
        }
예제 #2
0
        /// <summary> Объединение серий из вспомогательных файлов в исходный файл
        /// </summary>
        private void Merge()
        {
            _source.OpenWrite();
            _otherOne.OpenRead();
            _otherTwo.OpenRead();
            Counter.Inc(ECounter.OfReading, 2);
            Count = 0;

            // пока не конец какого-то из файлов
            while (!_otherOne.EndOfFile && !_otherTwo.EndOfFile)
            {
                // пока не конец какой-то из последовательностей
                while (!_otherOne.EndOfSequence && !_otherTwo.EndOfSequence)
                {
                    Counter.Inc(ECounter.OfCompare, 1);
                    // определяем, в какой последовательности текущий элемент больший
                    var tmp = _otherOne.CurrentValue <= _otherTwo.CurrentValue
                                     //если в первой, то последующее копирование произойдет
                        ? _otherOne  // из первой последовательности
                        : _otherTwo; // иначе из второй
                    tmp.Copy(_source);
                }

                CopyIfNotEndOfSeq(true);    // если последовательность кончилась, дописываем из другой
                CopyIfNotEndOfSeq(false);   // (сработает только одно копирование)

                _otherOne.NextSequence();
                _otherTwo.NextSequence();
                ++Count;
            } // while (не конец какого-то файла)

            CopyWhileNotEndOfFile(true);    // копируем до конца файла
            CopyWhileNotEndOfFile(false);   // (копирование только из одного, не закончившегося файла)

            _source.Close();
            _otherOne.Close();
            _otherTwo.Close();
        }