public IEnumerable<PartitionedFileStream> GetStreams() { _fileStream.Seek(0, SeekOrigin.Begin); var header = new PartitionedFileHeader(0); header.Read(_fileStream); var currentIndex = PartitionedFileHeader.DataOffset; var dataStart = currentIndex; var allOffsets = new List<long>(); while (currentIndex + sizeof(long) < dataStart + header.LengthOfCurrentBuffer) { var partitionedFileStreamOffset = Serializer.DeserializeLong(_fileStream); allOffsets.Add(partitionedFileStreamOffset); } var allStreams = new List<PartitionedFileStream>(); foreach (var offset in allOffsets) { header = new PartitionedFileHeader(offset); _fileStream.Seek(offset, SeekOrigin.Begin); header.Read(_fileStream); allStreams.Add(new PartitionedFileStream(_fileStream, header, AddNewHeaderSection)); } return allStreams; }
private void MoveToPreviousHeader() { if (_header.OffsetOfPrevHeader == null) throw new InvalidOperationException("Already at the beginning of the Stream"); var oldPosition = _fileStream.Position; _fileStream.Seek(_header.OffsetOfPrevHeader.Value, SeekOrigin.Begin); _header = new PartitionedFileHeader(_header.OffsetOfPrevHeader.Value); _header.Read(_fileStream); _fileStream.Seek(oldPosition, SeekOrigin.Begin); }
private void MoveToNextHeader() { var oldPosition = _fileStream.Position; if (_header.OffsetOfNextHeader == null) { var nextHeader = _getNewHeader(); _header.OffsetOfNextHeader = nextHeader.OffsetOfHeader; _fileStream.Seek(_header.OffsetOfHeader, SeekOrigin.Begin); _header.Write(_fileStream); nextHeader.OffsetOfPrevHeader = _header.OffsetOfHeader; _fileStream.Seek(nextHeader.OffsetOfHeader, SeekOrigin.Begin); nextHeader.Write(_fileStream); _header = nextHeader; } else { _fileStream.Seek(_header.OffsetOfNextHeader.Value, SeekOrigin.Begin); _header = new PartitionedFileHeader(_header.OffsetOfNextHeader.Value); _header.Read(_fileStream); } _fileStream.Seek(oldPosition, SeekOrigin.Begin); }