private void WriteFilesAsAttachments(JsonTextWriter jsonWriter) { int totalFilesCount = 0; fileStorage.Batch(accsesor => { totalFilesCount = accsesor.GetFileCount(); }); if (totalFilesCount == 0) { return; } int currentFilesCount = 0; int previousFilesCount = 0; var lastEtag = Etag.Empty; do { try { previousFilesCount = currentFilesCount; fileStorage.Batch(accsesor => { var fileHeaders = accsesor.GetFilesAfter(lastEtag, batchSize); foreach (var header in fileHeaders) { var file = StorageStream.Reading(fileStorage, header.FullPath); jsonWriter.WriteStartObject(); jsonWriter.WritePropertyName("Data"); int read = file.Read(filesBuffer, 0, filesBuffer.Length); jsonWriter.WriteRaw("\""); while (read > 0) { var base64 = Convert.ToBase64String(filesBuffer, 0, read); jsonWriter.WriteRaw(base64); jsonWriter.Flush(); read = file.Read(filesBuffer, 0, filesBuffer.Length); } jsonWriter.WriteRaw("\""); jsonWriter.SealValue(); jsonWriter.WritePropertyName("Metadata"); fileMetadata.WriteTo(jsonWriter); jsonWriter.WritePropertyName("Key"); jsonWriter.WriteValue(header.FullPath); jsonWriter.WritePropertyName("Etag"); jsonWriter.WriteValue(header.Etag.ToString()); jsonWriter.WriteEndObject(); lastEtag = header.Etag; currentFilesCount++; if (currentFilesCount % batchSize == 0) { ReportProgress("files", currentFilesCount, totalFilesCount); } } }); } catch (Exception e) { lastEtag = lastEtag.IncrementBy(1); currentFilesCount++; ReportCorrupted("files", currentFilesCount, e.Message); } finally { if (currentFilesCount > previousFilesCount) { ReportProgress("files", currentFilesCount, totalFilesCount); } } } while (currentFilesCount < totalFilesCount); }