// Copies a section of data from master stream to the log stream void BackupData(long location, int size) { logStream.Seek(0, SeekOrigin.End); // Write segment header SegmentMetadata sh = new SegmentMetadata { TransactionId = logStreamHeader.TransactionId, Position = location, Size = size }; long metadataPos = logStream.Position; sh.Save(logStream); // Copy data masterStream.Position = location; int bytesCopied = CopyData(masterStream, size, logStream); // If bytes copied differ from size in header, update the header if (bytesCopied != size) { logStream.Position = metadataPos; sh.Size = bytesCopied; sh.Save(logStream); } logStream.Flush(); // Update log stream header logStreamHeader.SegmentCount++; logStreamHeader.Save(logStream); logStream.Flush(); }