private void ReadAllFromDisk() { file.Position = ReadOffsets(Path.GetFileName(streamSource.GetLatestName(dataPath))); while (true) { using (var reader = new BinaryReader(file, Encoding.UTF8, leaveOpen: true)) { var itemPos = file.Position; PersistedEvent persistedEvent; try { persistedEvent = ReadPersistedEvent(reader); eventsCount++; } catch (EndOfStreamException) { lastWriteSnapshotCount = eventsCount; lastWriteSnapshotTime = DateTime.UtcNow; return; } catch (Exception e) { log.WarnException("Error during initial events read, file corrupted", e); if (options.AllowRecovery == false) { throw; } file.SetLength(itemPos); log.Warn("Recovered from corrupted file by truncating file to last known good position: " + itemPos); return; } switch (persistedEvent.State) { case EventState.Event: case EventState.Snapshot: idToPos.AddOrUpdate(persistedEvent.Id, s => new StreamInformation { LastPosition = itemPos, StreamLength = 1 }, (s, information) => new StreamInformation { LastPosition = itemPos, StreamLength = information.StreamLength + 1 }); break; case EventState.Delete: deleteCount++; var streamInformation = new StreamInformation { LastPosition = Deleted, StreamLength = 0 }; idToPos.AddOrUpdate(persistedEvent.Id, s => streamInformation, (s, information) => { deleteCount += information.StreamLength; return(streamInformation); }); break; default: throw new ArgumentOutOfRangeException(persistedEvent.State.ToString()); } } } }