2016-10-26 17 views
8

Szukam podejścia do przenoszenia kropli w MS Azure z jednego kontenera do drugiego. Jedynym rozwiązaniem, które znalazłem, jest użycie biblioteki przenoszenia danych Azure, ale wydaje się, że działa ona między różnymi kontami. Chciałbym przenieść obszar blob w ramach tego samego konta do innego kontenera.Azure Storage przeniesienie blob do innego pojemnika

Jan

Odpowiedz

2

Oto co pracował dla mnie (odpowiedź po edytowany przez @Deumber lepsza odpowiedź została wysłana):

public async Task<CloudBlockBlob> Move(CloudBlockBlob srcBlob, CloudBlobContainer destContainer) 
    { 
     CloudBlockBlob destBlob; 

     if (srcBlob == null) 
     { 
      throw new Exception("Source blob cannot be null."); 
     } 

     if (!destContainer.Exists()) 
     { 
      throw new Exception("Destination container does not exist."); 
     } 

     //Copy source blob to destination container 
     string name = srcBlob.Uri.Segments.Last(); 
     destBlob = destContainer.GetBlockBlobReference(name); 
     await destBlob.StartCopyAsync(srcBlob); 
     //remove source blob after copy is done. 
     srcBlob.Delete(); 
     return destBlob; 
    } 
+2

Musisz zresetować pozycję 'MemoryStream' między pobieraniem i wysyłaniem, w przeciwnym razie otrzymasz pusty plik: ' memoryStream.Position = 0; ' –

+1

Spowoduje to pobranie pliku ze sklepu BLOB, załadowanie go do pamięci, następnie prześlij go z powrotem do sklepu blob. Znacznie lepiej jest pozwolić usłudze pamięci masowej na kopiowanie, jak opisano w poniższych odpowiedziach. – dana

+1

Uwaga dla przyszłych czytelników: użytkownik edytował tę odpowiedź, ponieważ powyższe komentarze zostały napisane i nie są już stosowane. –

15

Nie używałem Azure Storage Data Movement Library ale jestem pewien, że to będzie działać na tym samym koncie przechowywania, jak również.

Przechodząc do pytania, ponieważ operacja nie jest obsługiwana natywnie w usłudze Azure Storage, można ją wdrożyć, wywołując Copy Blob, a następnie Delete Blob. Zasadniczo operacja jest jednak asynchroniczna, gdy jednak obiekt blobowy jest kopiowany na tym samym koncie pamięci, jest to operacja synchroniczna, tj. Kopiowanie odbywa się natychmiastowo. Proszę zobaczyć przykładowy kod poniżej, która nie tylko to:

static void MoveBlobInSameStorageAccount() 
    { 
     var cred = new StorageCredentials(accountName, accountKey); 
     var account = new CloudStorageAccount(cred, true); 
     var client = account.CreateCloudBlobClient(); 
     var sourceContainer = client.GetContainerReference("source-container-name"); 
     var sourceBlob = sourceContainer.GetBlockBlobReference("blob-name"); 
     var destinationContainer = client.GetContainerReference("destination-container-name"); 
     var destinationBlob = destinationContainer.GetBlockBlobReference("blob-name"); 
     destinationBlob.StartCopy(sourceBlob); 
     sourceBlob.Delete(DeleteSnapshotsOption.IncludeSnapshots); 
    } 

Należy jednak pamiętać, że używasz tego kodu tylko dla ruchu plamy na tym samym koncie przechowywania. Aby przenieść obiekt blob na konto magazynu, przed usunięciem obiektu typu blob źródłowego upewnij się, że operacja kopiowania została zakończona.

+1

Dzięki. Mam pracę. – Aprilia1982

+0

Pracował świetnie, ale drogi czytelniku, potrzebujesz pakietu "nndet" WIndowsAzure.Storage'. –

+0

Czy spowoduje to wyjście i/lub naliczenie opłat? –

10

Odpowiedź przyjęte w tej kwestii będzie przenieść plik do pamięci serwera, a następnie przesłać plik ponownie lazurować.

Lepiej niech praca w Azure

CloudBlobClient blobClient = StorageAccount.CreateCloudBlobClient(); 
    CloudBlobContainer sourceContainer = blobClient.GetContainerReference(SourceContainer); 
    CloudBlobContainer targetContainer = blobClient.GetContainerReference(TargetContainer); 

    CloudBlockBlob sourceBlob = sourceContainer.GetBlockBlobReference(fileToMove); 
    CloudBlockBlob targetBlob = targetContainer.GetBlockBlobReference(newFileName); 
        await targetBlob.StartCopyAsync(sourceBlob); 
Powiązane problemy