2011-12-21 89 views
5

我將文件存儲在blob存儲帳戶中的一個容器中。我需要在包含第一個容器中的文件的第二個容器中創建一個zip文件。在azure blob存儲中原位創建zip文件

我有一個解決方案,使用工作者角色和DotNetZip工作,但因爲zip文件可能最終大小爲1GB,我擔心使用MemoryStream對象等進行所有工作進程,並不是最好的方法做這件事。考慮到這個過程可能每天發生幾次,我最關心的是內存使用和釋放資源。

下面是一些非常剝離下來的代碼顯示基本的過程中,工人的角色:

using (ZipFile zipFile = new ZipFile()) 
{ 
    foreach (var uri in uriCollection) 
    { 
     var blob = new CloudBlob(uri); 

     byte[] fileBytes = blob.DownloadByteArray(); 

     using (var fileStream = new MemoryStream(fileBytes)) 
     { 
      fileStream.Seek(0, SeekOrigin.Begin); 

      byte[] bytes = CryptoHelp.EncryptAsBytes(fileStream, "password", null); 

      zipFile.AddEntry("entry name", bytes); 
     } 
    } 

    using (var zipStream = new MemoryStream()) 
    { 
     zipFile.Save(zipStream); 
     zipStream.Seek(0, SeekOrigin.Begin); 

     var blobRef = ContainerDirectory.GetBlobReference("output uri"); 
     blobRef.UploadFromStream(zipStream); 
    } 

} 

有人能提出一個更好的辦法嗎?

+0

使用拉丁文+1。 ;) – TrueWill 2011-12-27 05:20:47

+0

是的,雲服務webrole/workrole中的內存,CPU等資源使用情況總是令人擔憂。值得考慮。 +1 – 2014-04-24 09:04:25

回答

3

在撰寫本問題時,我並未意識到Azure中提供的LocalStorage選項。我能夠在LocalStorage中單獨編寫文件並將其寫入到LocalStorage中,然後將它們寫回到blob存儲。

+2

有沒有一點解釋/例子的機會?這不是一個真正的答案 – stuartdotnet 2014-05-04 22:54:20

+1

在這裏找到了一個示例http://stackoverflow.com/a/18853179/1280068 – stuartdotnet 2014-05-04 23:01:33

1

如果你所有擔心的是,你的記憶卡佔用了太多的內存,那麼你可以做的是實現你自己的數據流,當你的數據流被讀取時,你將你的zip文件添加到數據流中,並刪除已讀取的文件從流。這將使您的內存流大小保持爲一個文件的大小。

+0

任何代碼示例? – 2017-10-19 21:09:42