2013-10-03 8 views
6

हमारे पास एक फ़ाइल सिस्टम अबास्ट्रक्शन है जो हमें स्थानीय और क्लाउड (एज़ूर) स्टोरेज के बीच आसानी से स्विच करने की अनुमति देता है।क्लाउडब्लॉकब्लोब स्ट्रीम में जोड़ें

Stream OpenRead(); 
Stream OpenWrite(); 

हमारे आवेदन "समूह" एक फ़ाइल में दस्तावेजों का हिस्सा है:

पढ़ने और लिखने फ़ाइलों हम निम्नलिखित सदस्य के लिए

। हमारे स्थानीय भंडारण प्रदाता OpenWrite एक appendable धारा रिटर्न के लिए:

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

Azure ब्लॉब भंडारण के लिए हम निम्न कार्य करें:

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

दुर्भाग्य से इस ओवरराइड करता है ब्लॉब सामग्री हर बार। क्या एक लिखने योग्य धारा को वापस करना संभव है जिसे जोड़ा जा सकता है?

उत्तर

5

OpenWrite यहाँ http://msdn.microsoft.com/en-us/library/microsoft.windowsazure.storage.blob.cloudblockblob.openwrite.aspx के लिए प्रलेखन के आधार पर, The OpenWrite method will overwrite an existing blob unless explicitly prevented using the accessCondition parameter.

एक बात तुम कर सकते हो एक धारा में ब्लॉब डेटा पढ़ सकते हैं और अपने फोन आवेदन करने के लिए है कि धारा लौट सकते हैं और है कि अनुप्रयोग है कि धारा में डेटा संलग्न करते है। उदाहरण के लिए, नीचे दिए गए कोड देखें:

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

यही वह है जो मैंने किया। अनुशंसित दृष्टिकोण 'क्लाउडब्लॉकब्लोब.पूटब्लॉक' प्रतीत होता है लेकिन हम अपने "बंडलिंग" को करने के लिए पीडीएफ लाइब्रेरी पर निर्भर हैं जो केवल एक इनपुट स्ट्रीम के साथ काम करेगा। –

+1

'क्लाउडब्लॉकब्लोब.पूटब्लॉक' की अनुशंसा की जाती है क्योंकि यदि फ़ाइल बड़ी हो जाती है, तो उपर्युक्त दृष्टिकोण कुशल नहीं होगा क्योंकि आप संपूर्ण ब्लॉब डाउनलोड कर रहे हैं और इसे फिर से अपलोड कर रहे हैं। 'PutBlock' के साथ आप केवल संलग्न भाग अपलोड कर रहे हैं। –

+0

हां यह हर बार ब्लॉब * प्रतिस्थापित * का एक बड़ा नकारात्मक पक्ष है। हालांकि, जैसा कि बताया गया है, हम अपनी पीडीएफ लाइब्रेरी द्वारा सीमित हैं। यदि यह कोई समस्या हो तो हम ब्लॉब की स्थानीय प्रति कैशिंग को देख सकते हैं। –

0

वहाँ अब एक CloudAppendBlob वर्ग यदि आप किसी मौजूदा ब्लॉब के लिए सामग्री जोड़ने के लिए अनुमति देता है:

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()); 

लेकिन आप टेक्स्ट, बाइट सरणी, फ़ाइल से जोड़ सकते हैं। दस्तावेज की जांच करें।

संबंधित मुद्दे