C# 如何在dotnet core中块blob类型存储的现有文件中追加新的csv数据。我已尝试追加,但显示错误
这是我的代码:C# 如何在dotnet core中块blob类型存储的现有文件中追加新的csv数据。我已尝试追加,但显示错误,c#,.net-core,azure-storage-blobs,C#,.net Core,Azure Storage Blobs,这是我的代码: CloudStorageAccount storageAccount = CloudStorageAccount.Parse(AzureWebJobsStorage); CloudBlobClient serviceClient = storageAccount.CreateCloudBlobClient(); CloudBlobContainer container = serviceClient.GetContainerReference(ContainerName); /
CloudStorageAccount storageAccount = CloudStorageAccount.Parse(AzureWebJobsStorage);
CloudBlobClient serviceClient = storageAccount.CreateCloudBlobClient();
CloudBlobContainer container = serviceClient.GetContainerReference(ContainerName);
// CloudBlobContainer containerbackup = serviceClient.GetContainerReference(ContainerNameBackup);
CloudBlockBlob blob = container.GetBlockBlobReference(FileName);
// CloudBlockBlob blobBackUp = containerbackup.GetBlockBlobReference(FileName);
// CloudAppendBlob appendBlob = container.GetAppendBlobReference(FileName);
byte[] csvFile = Encoding.UTF8.GetBytes(csveventcontent.ToString().Trim());
if ( await blob.ExistsAsync())
using (var appendFileStream = new MemoryStream(csvFile))
await blob.UploadFromStreamAsync(appendFileStream);
else
{
using (var uploadFileStream = new MemoryStream(csvFile))
{
await blob.UploadFromStreamAsync(uploadFileStream);
uploadFileStream.Close();
}
}
class Program
{
static async System.Threading.Tasks.Task Main(string[] args)
{
var StorageConnectionString = "";
CloudStorageAccount storageAccount = CloudStorageAccount.Parse(StorageConnectionString);
CloudBlobClient serviceClient = storageAccount.CreateCloudBlobClient();
CloudBlobContainer container = serviceClient.GetContainerReference("pamelac");
CloudBlockBlob blob = container.GetBlockBlobReference("test.txt");
var appendFileStream = GetStreamFromString("hello"); // just for test, it will be "var appendFileStream = new MemoryStream(csvFile);" in your case
// download the blob stream:
MemoryStream stream = new MemoryStream();
await blob.DownloadToStreamAsync(stream);
stream.Position = 0;
Console.WriteLine("download stream to string: \n" + Encoding.UTF8.GetString((stream as MemoryStream).ToArray()));
// append the stream
var newStream = Append(stream, appendFileStream);
Console.WriteLine("new stream to string: \n" + Encoding.UTF8.GetString((newStream as MemoryStream).ToArray()));
// upload the new stream
await blob.UploadFromStreamAsync(newStream);
}
public static Stream GetStreamFromString(string text)
{
MemoryStream stream = new MemoryStream();
StreamWriter writer = new StreamWriter(stream);
writer.Write(text);
writer.Flush();
stream.Position = 0;
return stream;
}
public static Stream Append(Stream destination, Stream source)
{
destination.Position = destination.Length;
source.CopyTo(destination);
destination.Position = 0;
return destination;
}
}
没有直接附加数据的方法。用于将流上载到块blob。如果blob已经存在,它将被覆盖 您可以下载blob文件作为流,然后附加csv数据流,最后上载新流
// download the blob stream:
MemoryStream stream = new MemoryStream();
await blob.DownloadToStreamAsync(stream);
stream.Position = 0;
// append the stream, refer to https://stackoverflow.com/questions/15655210/how-to-merge-two-memory-streams
var newStream = Append(stream, appendFileStream);
// upload the new stream
await blob.UploadFromStreamAsync(newStream);
附加流方法:
public static Stream Append(Stream destination, Stream source)
{
destination.Position = destination.Length;
source.CopyTo(destination);
destination.Position = 0;
return destination;
}
我的测试代码:
CloudStorageAccount storageAccount = CloudStorageAccount.Parse(AzureWebJobsStorage);
CloudBlobClient serviceClient = storageAccount.CreateCloudBlobClient();
CloudBlobContainer container = serviceClient.GetContainerReference(ContainerName);
// CloudBlobContainer containerbackup = serviceClient.GetContainerReference(ContainerNameBackup);
CloudBlockBlob blob = container.GetBlockBlobReference(FileName);
// CloudBlockBlob blobBackUp = containerbackup.GetBlockBlobReference(FileName);
// CloudAppendBlob appendBlob = container.GetAppendBlobReference(FileName);
byte[] csvFile = Encoding.UTF8.GetBytes(csveventcontent.ToString().Trim());
if ( await blob.ExistsAsync())
using (var appendFileStream = new MemoryStream(csvFile))
await blob.UploadFromStreamAsync(appendFileStream);
else
{
using (var uploadFileStream = new MemoryStream(csvFile))
{
await blob.UploadFromStreamAsync(uploadFileStream);
uploadFileStream.Close();
}
}
class Program
{
static async System.Threading.Tasks.Task Main(string[] args)
{
var StorageConnectionString = "";
CloudStorageAccount storageAccount = CloudStorageAccount.Parse(StorageConnectionString);
CloudBlobClient serviceClient = storageAccount.CreateCloudBlobClient();
CloudBlobContainer container = serviceClient.GetContainerReference("pamelac");
CloudBlockBlob blob = container.GetBlockBlobReference("test.txt");
var appendFileStream = GetStreamFromString("hello"); // just for test, it will be "var appendFileStream = new MemoryStream(csvFile);" in your case
// download the blob stream:
MemoryStream stream = new MemoryStream();
await blob.DownloadToStreamAsync(stream);
stream.Position = 0;
Console.WriteLine("download stream to string: \n" + Encoding.UTF8.GetString((stream as MemoryStream).ToArray()));
// append the stream
var newStream = Append(stream, appendFileStream);
Console.WriteLine("new stream to string: \n" + Encoding.UTF8.GetString((newStream as MemoryStream).ToArray()));
// upload the new stream
await blob.UploadFromStreamAsync(newStream);
}
public static Stream GetStreamFromString(string text)
{
MemoryStream stream = new MemoryStream();
StreamWriter writer = new StreamWriter(stream);
writer.Write(text);
writer.Flush();
stream.Position = 0;
return stream;
}
public static Stream Append(Stream destination, Stream source)
{
destination.Position = destination.Length;
source.CopyTo(destination);
destination.Position = 0;
return destination;
}
}
copyToAsync没有添加2个流。我已经尝试了,但它没有添加。请尝试我的更新方法,它工作得很好。确保您调整了复制操作的位置,
目标
位置必须等于其长度,源
位置必须为0//获取附加内存流的错误=新建内存流();等待blob.DownloadToStreamAsync(流);流位置=0;字节[]blobstream=stream.ToArray();var existStream=GetStreamFromString(blobstream.ToString());var newStream=GetStreamFromString(csvFile.ToString());var appendstream=existStream.Append(新闻流);非常感谢…我明白了你的意思,现在它正在运行。对于给你带来的不便,我深表歉意。但是它显示了错误-如果你有错误,为什么不在你的问题中显示出来呢?错误消息通常是非常重要的信息。