Я пытаюсь взять файл и разделить его на части, а затем добавить sh каждый новый файл меньшего размера в azure. Я попытался записать MemoryStream в azure, но это приводит к немедленной загрузке файла, но файл в основном пуст. Я попытался использовать BufferedStream, который позволяет отправлять данные во время записи в него, но я не уверен, как завершить поток. Я попытался закрыть каждый из различных потоков, которые я использую, но это не работает, поскольку это приводит к исключению закрытого потока. Любая идея, как пометить поток как завершенный, чтобы библиотека azure знала, чтобы завершить sh загрузку файла?
Это действительно работает, чтобы дождаться полной сборки файла, а затем загрузить поток памяти, но я хотел бы иметь возможность писать на него во время загрузки, если это возможно.
CloudBlobClient blobClient = StorageAccount.CreateCloudBlobClient();
CloudBlobContainer blobContainer = blobClient.GetContainerReference("containerName");
using (FileStream fileStream = File.Open(path)
{
int key = 0;
CsvWriter csvWriter = null;
MemoryStream memoryStream = null;
BufferedStream bufferedStream = null;
StreamWriter streamWriter = null;
Task<StorageUri> uploadTask = null;
using (var reader = new StreamReader(fileStream))
using (var csv = new CsvReader(reader, CultureInfo.InvariantCulture))
{
csv.Read();
csv.ReadHeader();
await foreach (model row in csv.GetRecordsAsync<MyModel>())
{
if (row.KeyColumn != key)
{
if (memoryStream != null)
{
//Wiat for the current upload to finish
await csvWriter.FlushAsync();
csvWriter.Dispose();
await uploadTask;
}
//Start New Upload
key = row.KeyColumn;
memoryStream = new MemoryStream();
bufferedStream = new BufferedStream(memoryStream)
streamWriter = new StreamWriter(bufferedStream);
csvWriter = new CsvWriter(streamWriter, CultureInfo.InvariantCulture);
csvWriter.WriteHeader<MyModel>();
await csvWriter.FlushAsync();
CloudBlockBlob blockBlob = blobContainer.GetBlockBlobReference($"file_{key}.csv");
uploadTask = blockBlob.UploadFromStreamAsync(bufferedStream);
}
csvWriter.WriteRecord(row);
await csvWriter.FlushAsync();
}
if (memoryStream != null)
{
await csvWriter.FlushAsync();
csvWriter.Dispose();
await uploadTask;
}
}
}