Je recherche une approche pour déplacer un objet blob dans Azure d'un conteneur à un autre. La seule solution que j'ai trouvée consiste à utiliser la bibliothèque Azure Storage Data Movement, mais cela semble fonctionner entre différents comptes. Je souhaite déplacer l'objet blob du même compte vers un autre conteneur.
Voici ce qui a fonctionné pour moi (réponse modifiée après une meilleure réponse de @Deumber a été publiée):
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;
}
Je n'ai pas utilisé Azure Storage Data Movement Library
mais je suis sûr que cela fonctionnera également dans le même compte de stockage.
Pour en venir à votre question, étant donné que l'opération Move
n'est pas prise en charge nativement par Azure Storage, vous pouvez l'implémenter en appelant Copy Blob
suivi par Delete Blob
. En général, l'opération Copy
est asynchrone, mais lorsqu'un objet blob est copié dans le même compte de stockage, il s'agit d'une opération synchrone, c'est-à-dire que la copie se produit instantanément. Veuillez voir l'exemple de code ci-dessous qui fait exactement cela:
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);
}
Cependant, gardez à l'esprit que vous n'utilisez ce code que pour déplacer des objets blob dans le même compte de stockage. Pour déplacer des objets blob sur un compte de stockage, vous devez vous assurer que l'opération de copie est terminée avant de supprimer l'objet blob source.
La réponse acceptée dans cette question déplacera le fichier dans la mémoire de votre serveur, puis téléchargera à nouveau le fichier sur Azure.
Il vaut mieux laisser le travail à 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);