我们有一个文件系统抽象,使我们能够轻松地在本地和云(Azure)存储之间切换。
对于读取和写入文件,我们有以下成员:
Stream OpenRead();
Stream OpenWrite();
我们的应用程序的一部分将文档“捆绑”到一个文件中。对于我们的本地存储提供程序,OpenWrite
返回一个可追加流:
public Stream OpenWrite()
{
return new FileStream(fileInfo.FullName, FileMode.Open, FileAccess.ReadWrite, FileShare.ReadWrite, BufferSize, useAsync: true);
}
对于 Azure Blob 存储,我们执行以下操作:
public Stream OpenWrite()
{
return blob.OpenWrite();
}
不幸的是,这每次都会覆盖 blob 内容。是否可以返回一个可追加的可写流?
最佳答案
基于此处的 OpenWrite
文档 http://msdn.microsoft.com/en-us/library/microsoft.windowsazure.storage.blob.cloudblockblob.openwrite.aspx , OpenWrite 方法将覆盖现有的 blob,除非使用 accessCondition 参数明确阻止。
您可以做的一件事是读取流中的 blob 数据并将该流返回到调用应用程序,并让该应用程序将数据附加到该流。例如,请参阅下面的代码:
static void BlobStreamTest()
{
storageAccount = CloudStorageAccount.DevelopmentStorageAccount;
CloudBlobContainer container = storageAccount.CreateCloudBlobClient().GetContainerReference("temp");
container.CreateIfNotExists();
CloudBlockBlob blob = container.GetBlockBlobReference("test.txt");
blob.UploadFromStream(new MemoryStream());//Let's just create an empty blob for the sake of demonstration.
for (int i = 0; i < 10; i++)
{
try
{
using (MemoryStream ms = new MemoryStream())
{
blob.DownloadToStream(ms);//Read blob data in a stream.
byte[] dataToWrite = Encoding.UTF8.GetBytes("This is line # " + (i + 1) + "\r\n");
ms.Write(dataToWrite, 0, dataToWrite.Length);
ms.Position = 0;
blob.UploadFromStream(ms);
}
}
catch (StorageException excep)
{
if (excep.RequestInformation.HttpStatusCode != 404)
{
throw;
}
}
}
}
关于azure - 追加到 CloudBlockBlob 流,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/19161869/