UPDATE :
J'ai mis à jour le code après les commentaires de @IsaacAbrahams et la réponse de @Viggity, cette version devrait vous éviter de devoir tout charger dans un MemoryStream, et attend que la copie soit terminée avant de supprimer le blob source.
Pour tous ceux qui arrivent en retard à la fête et qui tombent sur ce billet en utilisant l'API de stockage Azure V2, voici une version de l'API de stockage Azure. pour le faire rapidement et proprement (+ version asynchrone) :
public static class BlobContainerExtensions
{
public static void Rename(this CloudBlobContainer container, string oldName, string newName)
{
//Warning: this Wait() is bad practice and can cause deadlock issues when used from ASP.NET applications
RenameAsync(container, oldName, newName).Wait();
}
public static async Task RenameAsync(this CloudBlobContainer container, string oldName, string newName)
{
var source = await container.GetBlobReferenceFromServerAsync(oldName);
var target = container.GetBlockBlobReference(newName);
await target.StartCopyFromBlobAsync(source.Uri);
while (target.CopyState.Status == CopyStatus.Pending)
await Task.Delay(100);
if (target.CopyState.Status != CopyStatus.Success)
throw new Exception("Rename failed: " + target.CopyState.Status);
await source.DeleteAsync();
}
}
Mise à jour pour Azure Storage 7.0
public static async Task RenameAsync(this CloudBlobContainer container, string oldName, string newName)
{
CloudBlockBlob source =(CloudBlockBlob)await container.GetBlobReferenceFromServerAsync(oldName);
CloudBlockBlob target = container.GetBlockBlobReference(newName);
await target.StartCopyAsync(source);
while (target.CopyState.Status == CopyStatus.Pending)
await Task.Delay(100);
if (target.CopyState.Status != CopyStatus.Success)
throw new Exception("Rename failed: " + target.CopyState.Status);
await source.DeleteAsync();
}
Avertissement : Il s'agit d'une méthode rapide et sale pour que le renommage s'exécute de manière synchrone. Cela correspond à mes besoins, mais comme d'autres utilisateurs l'ont noté, la copie peut prendre beaucoup de temps (jusqu'à plusieurs jours), donc la meilleure façon de procéder n'est PAS d'exécuter cette méthode en une seule fois comme cette réponse mais plutôt :
- Démarrer le processus de copie
- Interroger l'état de l'opération de copie
- Supprimez le blob original lorsque la copie est terminée.
0 votes
Maintenant, oui en utilisant ADLS Gen 2 avec l'espace de nom hiérarchique - docs.microsoft.com/fr/us/azure/storage/data-lake-storage/