62 votes

Renommer un Blob de stockage Azure

Est-il possible de renommer un Blob de stockage Azure en utilisant l'API de stockage Azure à partir d'un rôle Web ? La seule solution que j'ai pour le moment est de copier le blob vers un nouveau blob portant le bon nom et de supprimer l'ancien.

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/

5voto

Ann Yu Points 91

Copiez le blob, puis supprimez-le.

Testé pour des fichiers d'une taille de 1G, et cela fonctionne bien.

Pour plus d'informations, voir le échantillon sur MSDN.

StorageCredentials cred = new StorageCredentials("[Your?storage?account?name]", "[Your?storage?account?key]");  
CloudBlobContainer container = new CloudBlobContainer(new Uri("http://[Your?storage?account?name].blob.core.windows.net/[Your container name] /"), cred);  

string fileName = "OldFileName";  
string newFileName = "NewFileName";  
await container.CreateIfNotExistsAsync();  

CloudBlockBlob blobCopy = container.GetBlockBlobReference(newFileName);  

if (!await blobCopy.ExistsAsync())  
{  
    CloudBlockBlob blob = container.GetBlockBlobReference(fileName);  

    if (await blob.ExistsAsync())  
    {  
           // copy
           await blobCopy.StartCopyAsync(blob);                               
           // then delete
           await blob.DeleteIfExistsAsync();  
    } 
}

3voto

Albert Points 2619

Le renommage n'est pas possible. Voici une solution de contournement utilisant Azure SDK pour .NET v12 :

BlobClient sourceBlob = container.GetBlobClient(sourceBlobName);
BlobClient destBlob = container.GetBlobClient(destBlobName);
CopyFromUriOperation ops = await destBlob.StartCopyFromUriAsync(sourceBlob.Uri);

long copiedContentLength = 0;
while (ops.HasCompleted == false)
{
    copiedContentLength = await ops.WaitForCompletionAsync();
    await Task.Delay(100);
}
await sourceBlob.DeleteAsync();

1voto

Saher Points 2439

Vous pouvez maintenant avec la nouvelle version en aperçu public de ADLS Gen 2 ( Azure Data Lake Storage Gen 2 )

El Espace de nommage hiérarchique vous permet d'effectuer des manipulations atomiques de répertoires et de fichiers qui comprennent Renommer fonctionnement.

Toutefois, prenez note de ce qui suit : " Avec la version preview, si vous activez l'espace de noms hiérarchique, il n'y a pas d'interopérabilité des données ou des opérations entre les API REST Blob et Data Lake Storage Gen2. Cette fonctionnalité sera ajoutée pendant la prévisualisation."

Vous devrez vous assurer que vous créez les blobs (fichiers) en utilisant ADLS Gen 2 pour les renommer. Sinon, attendez que l'interopérabilité entre les API Blob et ADLS Gen 2 soit ajoutée pendant la période d'aperçu.

1voto

Gary Carter Points 11

En utilisant Azure Explorer de Monza Cloud, je peux renommer un blob de 18 gigaoctets en moins d'une seconde. Azure Storage Explorer de Microsoft prend 29 secondes pour cloner le même blob, donc Monza ne fait pas de copie. Monza ne fait donc pas de copie. Je sais que c'est rapide parce qu'immédiatement après le renommage par Monza, un clic sur le conteneur dans l'explorateur de stockage Microsoft Azure affiche le blob avec le nouveau nom.

0voto

Darrelk Points 430

La seule façon d'y parvenir est de déplacer le blob src vers une nouvelle destination/un nouveau nom. Voici mon code pour le faire

 public async Task<CloudBlockBlob> RenameAsync(CloudBlockBlob srcBlob, CloudBlobContainer destContainer,string name)
    {
        CloudBlockBlob destBlob;

        if (srcBlob == null && srcBlob.Exists())
        {
            throw new Exception("Source blob cannot be null and should exist.");
        }

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

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

Voici un exemple de code si vous souhaitez que la recherche de blob fasse partie de la méthode :

    public CloudBlockBlob RenameBlob(string oldName, string newName, CloudBlobContainer container)
    {
        if (!container.Exists())
        {
            throw new Exception("Destination container does not exist.");
        }
        //Get blob reference
        CloudBlockBlob sourceBlob = container.GetBlockBlobReference(oldName);

        if (sourceBlob == null && sourceBlob.Exists())
        {
            throw new Exception("Source blob cannot be null and should exist.");
        }

        // Get blob reference to which the new blob must be copied
        CloudBlockBlob destBlob = container.GetBlockBlobReference(newName);
        destBlob.StartCopyAsync(sourceBlob);

        //Delete source blob
        sourceBlob.Delete();
        return destBlob;
    }

Prograide.com

Prograide est une communauté de développeurs qui cherche à élargir la connaissance de la programmation au-delà de l'anglais.
Pour cela nous avons les plus grands doutes résolus en français et vous pouvez aussi poser vos propres questions ou résoudre celles des autres.

Powered by:

X