8

ローカル ストレージとクラウド (Azure) ストレージを簡単に切り替えることができるファイル システムの抽象化があります。

ファイルの読み取りと書き込みには、次のメンバーがあります。

Stream OpenRead();
Stream OpenWrite();

アプリケーションの一部は、ドキュメントを 1 つのファイルに「バンドル」します。ローカル ストレージ プロバイダーの場合、追加可能なストリーム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();
}

残念ながら、これは毎回ブロブの内容を上書きします。追加できる書き込み可能なストリームを返すことは可能ですか?

4

2 に答える 2

6

OpenWriteここのドキュメントに基づいてhttp://msdn.microsoft.com/en-us/library/microsoft.windowsazure.storage.blob.cloudblockblob.openwrite.aspxThe OpenWrite method will overwrite an existing blob unless explicitly prevented using the accessCondition parameter.

できることの 1 つは、ストリーム内の 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;
                }
            }
        }
    }
于 2013-10-03T15:27:42.593 に答える
3

CloudAppendBlob既存の blob にコンテンツを追加できるクラスが追加されました。

var account = CloudStorageAccount.Parse("storage account connectionstring");
var client = account.CreateCloudBlobClient();
var container = client.GetContainerReference("container name");
var blob = container.GetAppendBlobReference("blob name");

あなたの場合、ストリームから追加したい:

await blob.AppendFromStreamAsync(new MemoryStream());

ただし、テキスト、バイト配列、ファイルから追加できます。ドキュメントを確認してください。

于 2017-12-11T05:39:04.480 に答える