/// <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(); }
/// <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(); }