public PartitionedFileStreamFactory(string fileName)
 {
     _fileStream = new FileStream(fileName, FileMode.OpenOrCreate);
     if (_fileStream.Length == 0)
     {
         _header = new PartitionedFileHeader(0);
         _dataStart = _newStreamOffset = PartitionedFileHeader.DataOffset;
         _header.Write(_fileStream);
     }
 }
        public PartitionedFileStream GetNewStream()
        {
            var bufferOverrun = (_newStreamOffset + sizeof (long)) - (_dataStart + _header.LengthOfCurrentBuffer);
            if (bufferOverrun > 0)
            {
                _header.OffsetOfNextHeader = _fileStream.Length;
                _fileStream.Seek(_currentHeaderOffset, SeekOrigin.Begin);
                _header.Write(_fileStream);
                _currentHeaderOffset = _header.OffsetOfHeader;

                _header = AddNewHeaderSection();

                _header.OffsetOfPrevHeader = _currentHeaderOffset;
                _fileStream.Seek(_header.OffsetOfHeader, SeekOrigin.Begin);
                _header.Write(_fileStream);
            }

            _fileStream.Seek(_newStreamOffset, SeekOrigin.Begin);
            var newHeader = AddNewHeaderSection();
            Serializer.Serialize(_fileStream, _fileStream.Length);
            _newStreamOffset += sizeof (long);

            return new PartitionedFileStream(_fileStream, newHeader, AddNewHeaderSection);
        }
            public PartitionedFileHeader AddNewHeaderSection()
            {
                var header = new PartitionedFileHeader(_fileStream.Length) { LengthOfCurrentBuffer = _bufferSize };
                _fileStream.Seek(0, SeekOrigin.End);
                header.Write(_fileStream);

                var buffer = new byte[_bufferSize];
                _fileStream.Write(buffer, 0, buffer.Length);

                _fileStream.Seek(PartitionedFileHeader.DataOffset, SeekOrigin.Begin);

                return header;
            }
        private PartitionedFileHeader AddNewHeaderSection()
        {
            const int bufferSize = 4096;
            var header = new PartitionedFileHeader(_fileStream.Length) {LengthOfCurrentBuffer = bufferSize};
            _fileStream.Seek(0, SeekOrigin.End);
            header.Write(_fileStream);

            var buffer = new byte[bufferSize];
            _fileStream.Write(buffer, 0, buffer.Length);

            return header;
        }