2013-10-03 19 views
6

ファイルシステムの抽象化により、ローカルとクラウド(Azure)ストレージを簡単に切り替えることができます。一つのファイルに私たちのアプリケーション「バンドル」のドキュメントのCloudBlockBlobストリームに追加

Stream OpenRead(); 
Stream OpenWrite(); 

パート:私たちは、以下のメンバーを持っているファイルの読み書きのために

追記ストリームを返しOpenWrite私たちのローカル・ストレージ・プロバイダーの場合:

public Stream OpenWrite() 
{ 
    return new FileStream(fileInfo.FullName, FileMode.Open, FileAccess.ReadWrite, FileShare.ReadWrite, BufferSize, useAsync: true); 
} 

Azureのブロブストレージのために私たちは、次の操作を行います。

public Stream OpenWrite() 
{    
    return blob.OpenWrite(); 
} 

は、残念ながら、これは、blobの内容たびに上書きされます。追加可能な書き込み可能なストリームを返すことは可能ですか?あなたが行うことができ、ここでOpenWritehttp://msdn.microsoft.com/en-us/library/microsoft.windowsazure.storage.blob.cloudblockblob.openwrite.aspxのドキュメントに基づいて

答えて

5

The OpenWrite method will overwrite an existing blob unless explicitly prevented using the accessCondition parameter.

ことの一つは、ストリームのBLOBデータを読み、あなたの呼び出し元のアプリケーションにそのストリームを返すと、そのアプリケーションは、そのストリームにデータを追加しましょうさ。例えば、以下のコードを参照してください。あなたの場合

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

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

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; 
       } 
      } 
     } 
    } 
+0

これは私がやったことです。推奨されるアプローチは 'CloudBlockBlob.PutBlock'と思われますが、私たちはPDFライブラリを利用して、単一の入力ストリームでしか動作しない"バンドル "を実行しています。 –

+1

'CloudBlockBlob.PutBlock'が推奨されています。これは、ファイルが大きくなると、ブロブ全体をダウンロードしてもう一度アップロードするため、上記のアプローチが効率的でないためです。 'PutBlock'では、追加された部分だけをアップロードします。 –

+0

はい、毎回ブロブを置き換える*の大きな欠点です。しかし、前述のように、私たちはPDFライブラリによって制限されています。これが問題になる場合は、ブロブのローカルコピーをキャッシュすることがあります。 –

0

を既存のブロブにコンテンツを追加することができますCloudAppendBlobクラスが用意されました:

await blob.AppendFromStreamAsync(new MemoryStream()); 

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

関連する問題