2017-08-10 45 views
2

此刻我有許多容器。 Foreach容器我想從包含文件夾名稱的其他存儲帳戶添加一個空文件夾。然後我想用它填充必要的數據。通過編程在容器中創建一個子文件夾Azure C

我不確定是否有可以在容器中創建文件夾的屬性。

這裏我有兩個容器,一個來自我的sourceAccount,另一個來自我的targetAccount。我正在將數據從我的sourceAccout發送到我的tagetAccount。在我的容器中的目標帳戶dayBlob我想要創建子文件夾。

在這段代碼中,我得到了所有容器。當我得到這些容器時,我得到它們中的每一個的名稱。我想在我的目標容器中添加子文件夾,與我在foreach

 foreach (var items in containers) 
     { 
      var containerName = items.Name; 

     } 

我的代碼得到名稱如下

static CloudStorageAccount sourceAccount = new CloudStorageAccount(new StorageCredentials("name", "key"), true); 
static CloudStorageAccount targertAccount = new CloudStorageAccount(new StorageCredentials("name", "key"), true); 

     static void Main(string[] args) 
    { 
        DateTime dateToday = DateTime.Today; 

     DateTime date = new DateTime(); 
     DateTime dateutc = TimeZoneInfo.ConvertTimeToUtc(date); 
     TimeSpan startDay = new TimeSpan(00, 00, 00); 
     TimeSpan endDay = new TimeSpan(23, 59, 59); 
     var sourceClient = sourceAccount.CreateCloudBlobClient(); 
     var targetClient = targetAccount.CreateCloudBlobClient(); 
     var testContainer = sourceClient.GetContainerReference("test"); 
     var sourceContainer = sourceClient.GetContainerReference("downloads"); 
     var itDropBoxContainer = sourceClient.GetContainerReference("it-dropbox"); 
     var dayBlob = targetClient.GetContainerReference($"day{dateToday.Day}"); 

     date = DateTime.Parse($"{dateToday.Day}/{dateToday.Month}/{dateToday.Year}"); 
     var start = date + startDay; 
     var end = date + endDay; 
     IEnumerable<CloudBlobContainer> containers = sourceClient.ListContainers(); 

     foreach (var items in containers) 
     { 
      var containerName = items.Name; 

     } 

      foreach (IListBlobItem item in testContainer.ListBlobs(useFlatBlobListing: true)) 
      { 

       var blob = item as CloudBlockBlob; 
       var modificationDate = blob.Properties.LastModified; 
       // to set the modfication date as local time 
       var britishZone = TimeZoneInfo.FindSystemTimeZoneById("GMT Standard Time"); 
       var lastModified = TimeZoneInfo.ConvertTime((DateTimeOffset)modificationDate, britishZone); 
       if (lastModified > start && lastModified < end) 
       { 
        try 
        { 

         if (blob != null) 
         { 
          CloudBlockBlob sourceBlob = testContainer.GetBlockBlobReference(blob.Name); 
          CloudBlockBlob targetBlob = dayBlob.GetBlockBlobReference(blob.Name); 

          Console.WriteLine($"Successfully created a snapshot of blob {blob.Name}"); 
         } 
        } 
        catch (Exception ex) 
        { 

         ExceptionHandler.LogError(ex, "Failed to copy to the target folder"); 
        } 
       } 

       else 
       { 
        Console.WriteLine($"Failed to create a snapshot of blob {blob.Name}"); 

       } 

      } 
    } 
+0

您能否更新您的問題並告訴我們您正在嘗試解決的問題?您似乎想要將來自源帳戶的斑點複製到容器名稱中的目標帳戶,該容器名稱中包含當月的某天,即您的目標帳戶中將有31個斑點容器。空文件夾在這裏發揮作用? –

+0

@GauravMantri我已更新我的問題。我想爲每個目標容器添加3個文件夾。我想從源容器中的容器中獲取這些文件夾的名稱 –

+0

謝謝!但我不確定我瞭解你的代碼。當您退出forEach循環時,'containerName'變量的值將始終是存儲帳戶中最後一個容器的名稱。或者你只想在這個循環中創建一個子文件夾? –

回答

1

正如@GauravMantri提到的,​​我們不能沒有創建文件夾因爲文件夾是blob存儲中的虛擬實體。在使用它之前,您無需創建文件夾。例如,即使folder1不在容器中,我們也可以獲取folder1的引用。

var directory = container.GetDirectoryReference("folder1"); 
// Retrieve reference to a blob named "myblob". 
CloudBlockBlob blockBlob = directory.GetBlockBlobReference("myblob"); 

如果您確實想創建一個文件夾,您確實需要在其中創建一個Blob。

var directory = container.GetDirectoryReference("folder1"); 
CloudBlockBlob blockBlob = directory.GetBlockBlobReference("dummy.txt"); 
blockBlob.UploadFromByteArray(new byte[0], 0, 0); 

要列出容器中的所有文件夾,可以使用以下代碼。

var folders = container.ListBlobs().Where(b => b as CloudBlobDirectory != null).ToList(); 
foreach (var folder in folders) 
{ 
    Console.WriteLine(folder.Uri); 
} 
+0

這正是我一直在尋找的。反正有指定blob信息(如文件名等),或者這是否需要發生之前,該文件更改爲一個字節[]? – Drew

相關問題