Trasferire dati con la libreria di Spostamento dati
La libreria di spostamento dati Archiviazione di Azure è una libreria open source multipiattaforma progettata per caricamento, download e copia di BLOB e file ad alte prestazioni. La libreria di spostamento dati fornisce metodi pratici che non sono disponibili nella libreria client Archiviazione di Azure per .NET. Questi metodi consentono di impostare il numero di operazioni parallele, tenere traccia dello stato di avanzamento del trasferimento, riprendere un trasferimento annullato e altro ancora.
La libreria di spostamento dati è disponibile solo per .NET e supporta solo Archiviazione BLOB di Azure e File di Azure. È consigliabile prendere in considerazione queste limitazioni e altri problemi noti quando si decide se usare la libreria di spostamento dati.
Se si esegue la migrazione del codice dalla libreria Microsoft.Azure.Storage.DataMovement precedente (versione 2.X.X) alla libreria Azure.Storage.DataMovement corrente (versione 12.X.X), vedere la guida alla migrazione.
Documentazione di | riferimento api Pacchetto del codice | sorgente (NuGet) | Esempi: Blob / Files.Shares
Prerequisiti
- Sottoscrizione di Azure: creare un account gratuito
- Account di archiviazione di Azure: creare un account di archiviazione
- Ultima versione di .NET SDK per il sistema operativo in uso. Assicurarsi di ottenere l'SDK e non il runtime.
Configurazione dell'ambiente
Se non si ha un progetto esistente, questa sezione spiega come configurare un progetto per l'uso con la libreria client di Archiviazione BLOB di Azure per .NET. I passaggi includono l'installazione del pacchetto, l'aggiunta di direttive using
e la creazione di un oggetto client autorizzato.
Installare i pacchetti
Nella directory del progetto installare i pacchetti per la libreria client di spostamento dati Archiviazione di Azure e la libreria client di Identità di Azure usando il dotnet add package
comando . Il pacchetto Azure.Identity è necessario per le connessioni senza password ai servizi di Azure.
dotnet add package Azure.Storage.DataMovement
dotnet add package Azure.Storage.DataMovement.Blobs
dotnet add package Azure.Identity
Per usare la libreria di estensioni per File di Azure, installare il pacchetto Azure.Storage.DataMovement.Files.Shares:
dotnet add package Azure.Storage.DataMovement.Files.Shares
Aggiungere le direttive using
Per eseguire gli esempi di codice in questo articolo, aggiungere le direttive seguenti using
:
using Azure;
using Azure.Core;
using Azure.Identity;
using Azure.Storage.DataMovement;
using Azure.Storage.DataMovement.Blobs;
Se si usa la libreria di estensioni per File di Azure, aggiungere la direttiva seguenteusing
:
using Azure.Storage.DataMovement.Files.Shares;
Autorizzazione
Il meccanismo di autorizzazione deve disporre delle autorizzazioni necessarie per eseguire operazioni di caricamento, download o copia. Per l'autorizzazione con Microsoft Entra ID (scelta consigliata), è necessario disporre del ruolo predefinito di Controllo degli accessi in base al ruolo di Azure Collaboratore ai dati del BLOB di archiviazione o ruolo superiore.
Informazioni sulla libreria di spostamento dati
La libreria di spostamento dati Archiviazione di Azure è costituita da una libreria client comune e librerie di estensioni per Archiviazione BLOB di Azure e File di Azure. La libreria comune offre la funzionalità di base per il trasferimento dei dati, mentre le librerie di estensioni forniscono funzionalità specifiche dell'archiviazione BLOB e File di Azure. Per altre informazioni, vedere le risorse seguenti:
Creare un oggetto TransferManager
TransferManager è la classe principale per l'avvio e il controllo di tutti i tipi di trasferimenti, tra cui caricamento, download e copia. In questa sezione viene illustrato come creare un TransferManager
oggetto per lavorare con un file system locale, un archivio BLOB o un File di Azure.
Nota
Una procedura consigliata per la gestione client di Azure SDK consiste nel considerare un client come singleton, vale a dire che una classe ha un solo oggetto alla volta. Non è necessario mantenere più di un'istanza di un client per un determinato set di parametri del costruttore o di opzioni del client.
Il codice seguente illustra come creare un TransferManager
oggetto :
TransferManager transferManager = new(new TransferManagerOptions());
Facoltativamente, è possibile specificare un'istanza di TransferManagerOptions al costruttore, che applica determinate opzioni di configurazione a tutti i trasferimenti avviati dall'oggetto TransferManager
. Sono disponibili le opzioni di configurazione seguenti:
- CheckpointStoreOptions: facoltativo. Definisce le opzioni per la creazione di un checkpoint utilizzato per salvare lo stato di trasferimento in modo che i trasferimenti possano essere ripresi.
- Diagnostica: ottiene le opzioni di diagnostica di Transfer Manager.
-
ErrorHandling: facoltativo. Definisce la modalità di gestione degli errori durante un trasferimento. Il valore predefinito è
StopOnAnyFailure
. - MaximumConcurrency: numero massimo di ruoli di lavoro che possono essere usati in un trasferimento parallelo.
- ProvidersForResuming: provider di risorse che il gestore di trasferimento deve usare per riprendere un trasferimento. Prevede un provider per ogni provider di archiviazione in uso. Per altre informazioni, vedere Riprendere un trasferimento esistente.
Creare un oggetto StorageResource
StorageResource è la classe di base per tutte le risorse di archiviazione, inclusi BLOB e file. Per creare un StorageResource
oggetto, utilizzare una delle classi di provider seguenti:
-
BlobsStorageResourceProvider: usare questa classe per creare
StorageResource
istanze per un contenitore BLOB, un BLOB in blocchi, un BLOB di accodamento o un BLOB di pagine. -
ShareFilesStorageResourceProvider: usare questa classe per creare
StorageResource
istanze per un file o una directory. -
LocalFilesStorageResourceProvider: usare questa classe per creare
StorageResource
istanze per un file system locale.
Creare un StorageResource
oggetto per l'archiviazione BLOB
Il codice seguente illustra come creare un StorageResource
oggetto per contenitori BLOB e BLOB usando :Uri
// Create a token credential
TokenCredential tokenCredential = new DefaultAzureCredential();
BlobsStorageResourceProvider blobsProvider = new(tokenCredential);
// Get a container resource
StorageResource container = await blobsProvider.FromContainerAsync(
new Uri("http://<storage-account-name>.blob.core.windows.net/sample-container"));
// Get a block blob resource - default is block blob
StorageResource blockBlob = await blobsProvider.FromBlobAsync(
new Uri("http://<storage-account-name>.blob.core.windows.net/sample-container/sample-block-blob"),
new BlockBlobStorageResourceOptions());
// Use a similar approach to get a page blob or append blob resource
È anche possibile creare un StorageResource
oggetto usando un oggetto client da Azure.Storage.Blobs.
// Create a token credential
TokenCredential tokenCredential = new DefaultAzureCredential();
BlobContainerClient blobContainerClient = new(
new Uri("https://<storage-account-name>.blob.core.windows.net/sample-container"),
tokenCredential);
StorageResource containerResource = BlobsStorageResourceProvider.FromClient(blobContainerClient);
BlockBlobClient blockBlobClient = blobContainerClient.GetBlockBlobClient("sample-block-blob");
StorageResource blockBlobResource = BlobsStorageResourceProvider.FromClient(blockBlobClient);
// Use a similar approach to get a page blob or append blob resource
Avviare un nuovo trasferimento
Tutti i trasferimenti devono specificare un'origine e una destinazione. Sia l'origine che la destinazione sono di tipo StorageResource
, che può essere StorageResourceContainer
o StorageResourceItem
. Per un determinato trasferimento, l'origine e la destinazione devono essere dello stesso tipo. Ad esempio, se l'origine è un contenitore BLOB, la destinazione deve essere un contenitore BLOB.
È possibile avviare un nuovo trasferimento chiamando il metodo seguente:
Questo metodo restituisce un oggetto TransferOperation che rappresenta il trasferimento. È possibile utilizzare l'oggetto TransferOperation
per monitorare lo stato di avanzamento del trasferimento o ottenere l'ID di trasferimento. L'ID trasferimento è un identificatore univoco per il trasferimento necessario per riprendere un trasferimento o sospendere un trasferimento.
Facoltativamente, è possibile specificare un'istanza di TransferOptions a StartTransferAsync
o ResumeTransferAsync
, che applica determinate opzioni di configurazione a un trasferimento specifico. Sono disponibili le opzioni di configurazione seguenti:
-
CreationMode: configura il comportamento quando un trasferimento rileva una risorsa già esistente. L'impostazione predefinita è quando
FailIfExists
si avvia un nuovo trasferimento. Quando si riprende un trasferimento, le impostazioni predefinite possono variare. Per tutte le risorse enumerate correttamente all'avvio del trasferimento,CreationMode
per impostazione predefinita viene usato il valore iniziale. Per le risorse rimanenti, viene applicato il valore predefinito normale. - InitialTransferSize: dimensioni della prima richiesta di intervallo in byte. Le dimensioni di trasferimento singole inferiori a questo limite vengono caricate o scaricate in una singola richiesta. I trasferimenti superiori a questo limite continuano a essere scaricati o caricati in blocchi di dimensioni MaximumTransferChunkSize. Il valore predefinito è 32 MiB. Quando si riprende un trasferimento, il valore predefinito è il valore specificato al primo avvio del trasferimento.
- MaximumTransferChunkSize: dimensione massima da usare per ogni blocco durante il trasferimento dei dati in blocchi. Il valore predefinito è 4 MiB. Quando si riprende un trasferimento, il valore predefinito è il valore specificato al primo avvio del trasferimento.
- ProgressHandlerOptions: facoltativo. Opzioni per la modifica del comportamento di ProgressHandler.
Esempio: Caricare una directory locale in un contenitore BLOB
L'esempio di codice seguente illustra come avviare un nuovo trasferimento per caricare una directory locale in un contenitore BLOB:
// Create a token credential
TokenCredential tokenCredential = new DefaultAzureCredential();
TransferManager transferManager = new(new TransferManagerOptions());
BlobsStorageResourceProvider blobsProvider = new(tokenCredential);
string localDirectoryPath = "C:/path/to/directory";
Uri blobContainerUri = new Uri("https://<storage-account-name>.blob.core.windows.net/sample-container");
TransferOperation transferOperation = await transferManager.StartTransferAsync(
sourceResource: LocalFilesStorageResourceProvider.FromDirectory(localDirectoryPath),
destinationResource: await blobsProvider.FromContainerAsync(blobContainerUri));
await transferOperation.WaitForCompletionAsync();
Esempio: Copiare un contenitore o un BLOB
È possibile usare la libreria di spostamento dati per copiare tra due StorageResource
istanze. Per le risorse BLOB, il trasferimento usa l'operazione Put BLOB From URL , che esegue una copia da server a server.
Nell'esempio di codice seguente viene illustrato come avviare un nuovo trasferimento per copiare tutti i BLOB in un contenitore BLOB di origine in un contenitore BLOB di destinazione. Il contenitore di destinazione deve esistere già. In questo esempio viene impostato CreationMode su OverwriteIfExists
per sovrascrivere tutti i BLOB di destinazione già esistenti. Puoi modificare la CreationMode
proprietà in base alle esigenze della tua app.
Uri sourceContainerUri = new Uri("https://<storage-account-name>.blob.core.windows.net/source-container");
Uri destinationContainerUri = new Uri("https://<storage-account-name>.blob.core.windows.net/dest-container");
TransferOperation transferOperation = await transferManager.StartTransferAsync(
sourceResource: await blobsProvider.FromContainerAsync(
sourceContainerUri,
new BlobStorageResourceContainerOptions()
{
BlobPrefix = "source/directory/prefix"
}),
destinationResource: await blobsProvider.FromContainerAsync(
destinationContainerUri,
new BlobStorageResourceContainerOptions()
{
// All source blobs are copied as a single type of destination blob
// Defaults to block blob, if not specified
BlobType = BlobType.Block,
BlobPrefix = "destination/directory/prefix"
}),
transferOptions: new TransferOptions()
{
CreationMode = StorageResourceCreationMode.OverwriteIfExists,
}
);
await transferOperation.WaitForCompletionAsync();
Nell'esempio di codice seguente viene illustrato come avviare un nuovo trasferimento per copiare un BLOB di origine in un BLOB di destinazione. In questo esempio viene impostato CreationMode su OverwriteIfExists
per sovrascrivere il BLOB di destinazione, se già esistente. Puoi modificare la CreationMode
proprietà in base alle esigenze della tua app.
Uri sourceBlobUri = new Uri(
"https://<storage-account-name>.blob.core.windows.net/source-container/source-blob");
Uri destinationBlobUri = new Uri(
"https://<storage-account-name>.blob.core.windows.net/dest-container/dest-blob");
TransferOperation transferOperation = await transferManager.StartTransferAsync(
sourceResource: await blobsProvider.FromBlobAsync(sourceBlobUri),
destinationResource: await blobsProvider.FromBlobAsync(destinationBlobUri, new BlockBlobStorageResourceOptions()),
transferOptions: new TransferOptions()
{
CreationMode = StorageResourceCreationMode.OverwriteIfExists,
}
);
await transferOperation.WaitForCompletionAsync();
Riprendere un trasferimento esistente
Salvando in modo permanente lo stato di avanzamento del trasferimento su disco, la libreria di spostamento dati consente di riprendere un trasferimento non riuscito prima del completamento o di essere altrimenti annullato o sospeso. Per riprendere un trasferimento, l'oggetto TransferManager
deve essere configurato con StorageResourceProvider
istanze in grado di riassemblare il trasferimento dai dati persistenti. È possibile utilizzare la ProvidersForResuming
proprietà della classe TransferManagerOptions per specificare i provider.
L'esempio di codice seguente illustra come inizializzare un TransferManager
oggetto in grado di riprendere un trasferimento tra il file system locale e l'archiviazione BLOB:
// Create a token credential
TokenCredential tokenCredential = new DefaultAzureCredential();
TransferManager transferManager = new(new TransferManagerOptions()
{
ProvidersForResuming = new List<StorageResourceProvider>()
{
new BlobsStorageResourceProvider(tokenCredential)
}
});
Per riprendere un trasferimento, chiamare il metodo seguente:
Specificare l'ID di trasferimento del trasferimento che si desidera riprendere. L'ID trasferimento è un identificatore univoco per il trasferimento restituito come parte dell'oggetto all'avvio TransferOperation
del trasferimento. Se non si conosce il valore dell'ID di trasferimento, è possibile chiamare TransferManager.GetTransfersAsync per trovare il trasferimento e il relativo ID corrispondente.
L'esempio di codice seguente illustra come riprendere un trasferimento:
TransferOperation resumedTransfer = await transferManager.ResumeTransferAsync(transferId: ID);
Nota
Il percorso dei dati di trasferimento permanente è diverso dal percorso predefinito se TransferCheckpointStoreOptions è impostato come parte di TransferManagerOptions
. Per riprendere i trasferimenti registrati con un archivio checkpoint personalizzato, è necessario fornire le stesse opzioni dell'archivio checkpoint per l'oggetto TransferManager
che riprende il trasferimento.
Monitorare lo stato di avanzamento del trasferimento
I trasferimenti possono essere monitorati e osservati tramite diversi meccanismi, a seconda delle esigenze dell'app. In questa sezione viene illustrato come monitorare lo stato di avanzamento del trasferimento usando l'oggetto TransferOperation
e come monitorare un trasferimento usando TransferOptions
eventi.
Esempio: Monitorare lo stato di avanzamento del trasferimento usando l'oggetto TransferOperation
È possibile monitorare lo stato di avanzamento del trasferimento usando l'oggetto TransferOperation
restituito dal StartTransferAsync
metodo . È anche possibile chiamare TransferManager.GetTransfersAsync per enumerare tutti i trasferimenti per un TransferManager
oggetto .
L'esempio di codice seguente illustra come scorrere tutti i trasferimenti e scrivere lo stato di ogni trasferimento in un file di log:
async Task CheckTransfersAsync(TransferManager transferManager)
{
await foreach (TransferOperation transfer in transferManager.GetTransfersAsync())
{
using StreamWriter logStream = File.AppendText("path/to/log/file");
logStream.WriteLine(Enum.GetName(typeof(TransferState), transfer.Status.State));
}
}
TransferStatus definisce lo stato del processo di trasferimento.
TransferStatus
include le proprietà seguenti:
Proprietà | Type | Descrizione |
---|---|---|
HasCompletedSuccessfully |
Boolean | Rappresenta se il trasferimento viene completato correttamente senza errori o elementi ignorati. |
HasFailedItems |
Booleano | Rappresenta se il trasferimento contiene elementi di errore. Se impostato su true , il trasferimento ha almeno un elemento di errore. Se impostato su false , il trasferimento non presenta errori. |
HasSkippedItems |
Booleano | Rappresenta se il trasferimento contiene elementi ignorati. Se impostato su true , il trasferimento ha almeno un elemento ignorato. Se impostato su false , il trasferimento non ha attualmente elementi ignorati. È possibile non avere mai elementi ignorati se SkipIfExists non è abilitato in TransferOptions.CreationMode. |
State |
TransferState | Definisce i tipi di stato che un trasferimento può avere. Per informazioni dettagliate, vedere TransferState . |
Esempio: Monitorare lo stato di avanzamento del trasferimento usando TransferOptions
eventi
È possibile monitorare lo stato di avanzamento del trasferimento ascoltando gli eventi forniti dalla classe TransferOptions . L'istanza TransferOptions
viene passata al StartTransferAsync
metodo e fornisce eventi che vengono attivati quando un trasferimento viene completato, ha esito negativo, viene ignorato o cambia lo stato.
Nell'esempio di codice seguente viene illustrato come restare in ascolto di un evento di completamento del trasferimento usando TransferOptions
:
async Task<TransferOperation> ListenToTransfersAsync(
TransferManager transferManager,
StorageResource source,
StorageResource destination)
{
TransferOptions transferOptions = new();
transferOptions.ItemTransferCompleted += (TransferItemCompletedEventArgs args) =>
{
using (StreamWriter logStream = File.AppendText("path/to/log/file"))
{
logStream.WriteLine($"File Completed Transfer: {args.Source.Uri.AbsoluteUri}");
}
return Task.CompletedTask;
};
return await transferManager.StartTransferAsync(
source,
destination,
transferOptions);
}
Usare i metodi di estensione per BlobContainerClient
Per le applicazioni con codice esistente che usa la BlobContainerClient
classe di Azure.Storage.Blobs, è possibile usare i metodi di estensione per avviare i trasferimenti direttamente da un BlobContainerClient
oggetto . I metodi di estensione vengono forniti nella classe BlobContainerClientExtensions (o ShareDirectoryClientExtensions per File di Azure) e offrono alcuni dei vantaggi dell'uso TransferManager
con modifiche minime al codice. In questa sezione si apprenderà come usare i metodi di estensione per eseguire trasferimenti da un BlobContainerClient
oggetto .
Installare il pacchetto Azure.Storage.Blobs se non è già disponibile:
dotnet add package Azure.Storage.Blobs
Aggiungere le direttive seguenti using
all'inizio del file di codice:
using Azure.Storage.Blobs;
using Azure.Storage.Blobs.Models;
L'esempio di codice seguente illustra come creare un'istanza di per BlobContainerClient
un contenitore BLOB denominato sample-container
:
// Create a token credential
TokenCredential tokenCredential = new DefaultAzureCredential();
BlobServiceClient client = new BlobServiceClient(
new Uri("https://<storage-account-name>.blob.core.windows.net"),
tokenCredential);
BlobContainerClient containerClient = client.GetBlobContainerClient("sample-container");
Nell'esempio di codice seguente viene illustrato come caricare il contenuto sample-container
della directory locale in usando UploadDirectoryAsync
:
TransferOperation transfer = await containerClient
.UploadDirectoryAsync(WaitUntil.Started, "local/directory/path");
await transfer.WaitForCompletionAsync();
Nell'esempio di codice seguente viene illustrato come scaricare il contenuto di sample-container
in una directory locale usando DownloadToDirectoryAsync
:
TransferOperation transfer = await containerClient
.DownloadToDirectoryAsync(WaitUntil.Started, "local/directory/path");
await transfer.WaitForCompletionAsync();
Per altre informazioni sui metodi di estensione per BlobContainerClient
, vedere Estensioni in BlobContainerClient.
Passaggio successivo
- Gli esempi di codice per DataMovement.Blobs e DataMovement.Files.Shares sono disponibili nel repository GitHub di Azure SDK per .NET.