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(新闻流);非常感谢…我明白了你的意思,现在它正在运行。对于给你带来的不便,我深表歉意。但是它显示了错误-如果你有错误,为什么不在你的问题中显示出来呢?错误消息通常是非常重要的信息。