2017-08-17 1 views
0

Je dois passer des fichiers, du stockage BLOB au stockage de fichiers. Ces deux stockages se trouvent dans le même compte de stockage. Ici, je reçois le fichier stockage:Azure déplace les fichiers du stockage BLOB vers le stockage de fichiers dans le même compte de stockage

var storage = GetStorageAccount(resourceGroup, storageName); 
CloudFileClient fileClient = storage.CreateCloudFileClient(); 
CloudFileShare share = fileClient.GetShareReference(projectId.ToString()); 

et on peut supposer que j'ai aussi une référence au stockage de blob, ainsi que l'uri du fichier que je veux passer au stockage de fichiers. Comment puis-je faire cela, de préférence sans utiliser AzCopy, mais en utilisant le code C#?

Répondre

0

Je l'ai eu à travailler de la façon suivante:

CloudBlobClient blobClient = storage.CreateCloudBlobClient(); 
CloudBlobContainer container = blobClient.GetContainerReference("powershellscripts"); 
var blockBlob = container.GetBlockBlobReference("WriteToFile.ps1"); 

SharedAccessBlobPolicy adHocSAS = new SharedAccessBlobPolicy() 
     { 
      // When the start time for the SAS is omitted, the start time is assumed to be the time when the storage service receives the request. 
      // Omitting the start time for a SAS that is effective immediately helps to avoid clock skew. 
      SharedAccessExpiryTime = DateTime.UtcNow.AddHours(24), 
      Permissions = SharedAccessBlobPermissions.Read | SharedAccessBlobPermissions.Write | SharedAccessBlobPermissions.Create 
     }; 
string sasBlobToken = blockBlob.GetSharedAccessSignature(adHocSAS); 
// Create a new file in your target file storage directory 
CloudFile sourceFile = share.GetRootDirectoryReference().GetFileReference("MyExample.ps1"); 

Uri fileSasUri = new Uri(blockBlob.StorageUri.PrimaryUri.ToString() + sasBlobToken); 
await sourceFile.StartCopyAsync(blockBlob); 

Alors vous devez d'abord obtenir un à partir du blob jeton vous voulez copier, puis il suffit de créer un fichier simple votre répertoire de stockage de fichiers cible et appelez StartCopy.

2

Vous pouvez vous référer au code qui utilise les mêmes bibliothèques cadres:

En premier lieu, inclure les classes dont vous avez besoin, ici nous incluons bibliothèque client stockage, la bibliothèque de transfert de données de stockage et le filetage .NET parce que la bibliothèque de mouvements de données fournit des interfaces asynchrones Tâche pour transférer des objets de stockage:

using System; 
using System.Threading; 
using Microsoft.WindowsAzure.Storage; 
using Microsoft.WindowsAzure.Storage.Blob; 
using Microsoft.WindowsAzure.Storage.DataMovement; 

maintenant, utilisez les interfaces fournies par le client de stockage lib pour configurer le contexte de stockage (trouver plus d'informations à partir de .NET comment utiliser Blob Storage):

string storageConnectionString = "myStorageConnectionString"; 
CloudStorageAccount account = CloudStorageAccount.Parse(storageConnectionString); 
CloudBlobClient blobClient = account.CreateCloudBlobClient(); 
CloudBlobContainer blobContainer = blobClient.GetContainerReference("mycontainer"); 
blobContainer.CreateIfNotExists(); 
string sourcePath = "path\\to\\test.txt"; 
CloudBlockBlob destBlob = blobContainer.GetBlockBlobReference("myblob"); 

Une fois que vous avez installé le contexte blob de stockage, vous pouvez commencer à utiliser WindowsAzure.Storage.DataMovement.TransferManager pour télécharger le blob et suivre la progression du téléchargement,

// Setup the number of the concurrent operations 
TransferManager.Configurations.ParallelOperations = 64; 
// Setup the transfer context and track the upoload progress 
SingleTransferContext context = new SingleTransferContext(); 
context.ProgressHandler = new Progress<TransferStatus>((progress) => 
{ 
    Console.WriteLine("Bytes uploaded: {0}", progress.BytesTransferred); 
}); 
// Upload a local blob 
var task = TransferManager.UploadAsync(
    sourcePath, destBlob, null, context, CancellationToken.None); 
task.Wait(); 

En savoir plus:

Develop for Azure File storage with .Net

Storage Client Library Reference for .NET - MSDN

Si vous copiez un blob dans un fichier ou d'un fichier à un blob, vous devez utiliser une signature d'accès partagé (SAS) pour authentifier l'objet source, même si vous copiez dans le même compte de stockage.

0

ont une référence au stockage de blob, ainsi que l'uri du fichier que je veux passer au stockage de fichiers

CloudFile class nous permet d'initialiser une nouvelle instance de la classe CloudFile en utilisant un URI absolu dans le fichier. Vous pouvez vous référer à l'exemple de code suivant pour copier le fichier blob dans le fichier Azure.

CloudStorageAccount storageAccount = CloudStorageAccount.Parse("{connection_string}"); 

CloudBlobClient blobClient = storageAccount.CreateCloudBlobClient(); 

CloudBlobContainer container = blobClient.GetContainerReference("mycontainer"); 

CloudBlockBlob blockBlob = container.GetBlockBlobReference("source.txt"); 
blockBlob.OpenRead();   

CloudFile desfile = new CloudFile(new Uri("https://{account_name}.file.core.windows.net/myfiles/des.txt"), new Microsoft.WindowsAzure.Storage.Auth.StorageCredentials("{sasToken}")); 

desfile.StartCopy(blockBlob); 
+0

Je reçois une exception 404 non trouvée sur la dernière ligne, mais le fichier est définitivement là. – Iason