async Task WriteTasksAsync(IEnumerable <WriteTask> writeTasks, DirSnap dirSnap) { if (_currentWriter == null) { string filePath; if (dirSnap.IsEmpty) { filePath = dirSnap.GetFilePath(0); dirSnap.RegisterFile(filePath); } else { filePath = dirSnap.LastFile().FilePath; } var fileInfo = new FileInfo(filePath); _currentWriter = GetWriter(filePath); _approxBytesWritten = fileInfo.Exists ? fileInfo.Length : 0; } var flushNeeded = false; foreach (var task in writeTasks) { foreach (var data in task.Data) { var line = Convert.ToBase64String(data); _currentWriter.Write(line); _currentWriter.WriteLine(LineTerminator); _approxBytesWritten += line.Length + 1; flushNeeded = true; if (_approxBytesWritten > _settings.ApproximateMaximumFileLength) { await _currentWriter.FlushAsync(); flushNeeded = false; _currentWriter.Dispose(); var nextFileNumber = dirSnap.LastFile().FileNumber + 1; var nextFilePath = dirSnap.GetFilePath(nextFileNumber); dirSnap.RegisterFile(nextFilePath); _approxBytesWritten = 0; _currentWriter = GetWriter(nextFilePath); var allFiles = dirSnap.GetFiles().ToList(); var filesToDelete = allFiles .Take(allFiles.Count - _settings.NumberOfFilesToKeep) .ToList(); foreach (var file in filesToDelete) { try { File.Delete(file.FilePath); dirSnap.RemoveFile(file); _logger.Verbose($"Deleted file {file.FilePath}"); } catch (Exception exception) { _logger.Information($"Could not delete file {file.FilePath}: {exception.Message}"); break; } } } } } if (flushNeeded) { await _currentWriter.FlushAsync(); } }