Nota
L'accesso a questa pagina richiede l'autorizzazione. È possibile provare ad accedere o modificare le directory.
L'accesso a questa pagina richiede l'autorizzazione. È possibile provare a modificare le directory.
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. You should consider these limitations and other known issues when deciding whether to use the Data Movement library.
If you're migrating code from the older Microsoft.Azure.Storage.DataMovement library (version 2.X.X) to the current Azure.Storage.DataMovement library (version 12.X.X), see the Migration guide.
Documentazione di | riferimento api Pacchetto del codice | sorgente (NuGet) | Esempi: Blob / Files.Shares
Prerequisites
- Sottoscrizione di Azure: creare un account gratuito
- Account di archiviazione di Azure: creare un account di archiviazione
- Latest .NET SDK for your operating system. 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.
Install packages
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 . The Azure.Identity package is needed for passwordless connections to Azure services.
dotnet add package Azure.Storage.DataMovement
dotnet add package Azure.Storage.DataMovement.Blobs
dotnet add package Azure.Identity
To work with extension library for Azure Files, install the Azure.Storage.DataMovement.Files.Shares package:
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;
Authorization
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 is the main class for starting and controlling all types of transfers, including upload, download, and copy. 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.
Note
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());
You can optionally provide an instance of TransferManagerOptions to the constructor, which applies certain configuration options to all transfers started by the TransferManager
object. Sono disponibili le opzioni di configurazione seguenti:
- CheckpointStoreOptions: Optional. Definisce le opzioni per la creazione di un checkpoint utilizzato per salvare lo stato di trasferimento in modo che i trasferimenti possano essere ripresi.
- Diagnostics: Gets the transfer manager diagnostic options.
- Definisce la modalità di gestione degli errori durante un trasferimento. Il valore predefinito è
StopOnAnyFailure
. Default isStopOnAnyFailure
. - MaximumConcurrency: The maximum number of workers that can be used in a parallel transfer.
- ProvidersForResuming: Resource providers for the transfer manager to use in resuming a transfer. Prevede un provider per ogni provider di archiviazione in uso. Per altre informazioni, vedere Riprendere un trasferimento esistente.
Creare un oggetto StorageResource
StorageResource is the base class for all storage resources, including blobs and files. Per creare un StorageResource
oggetto, utilizzare una delle classi di provider seguenti:
-
BlobsStorageResourceProvider: Use this class to create
StorageResource
instances for a blob container, block blob, append blob, or page blob. -
ShareFilesStorageResourceProvider: Use this class to create
StorageResource
instances for a file or directory. -
LocalFilesStorageResourceProvider: Use this class to create
StorageResource
instances for a local file system.
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
You can also create a StorageResource
object using a client object from 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:
This method returns a TransferOperation object that represents the transfer. È 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.
You can optionally provide an instance of TransferOptions to StartTransferAsync
or ResumeTransferAsync
, which applies certain configuration options to a specific transfer. Sono disponibili le opzioni di configurazione seguenti:
-
CreationMode: Configures the behavior when a transfer encounters a resource that already exists. 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: The size of the first range request in bytes. Le dimensioni di trasferimento singole inferiori a questo limite vengono caricate o scaricate in una singola richiesta. Transfers larger than this limit continue being downloaded or uploaded in chunks of size MaximumTransferChunkSize. Il valore predefinito è 32 MiB. Quando si riprende un trasferimento, il valore predefinito è il valore specificato al primo avvio del trasferimento.
- MaximumTransferChunkSize: The maximum size to use for each chunk when transferring data in chunks. Il valore predefinito è 4 MiB. Quando si riprende un trasferimento, il valore predefinito è il valore specificato al primo avvio del trasferimento.
- ProgressHandlerOptions: Optional. 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 this example, we set CreationMode to OverwriteIfExists
to overwrite any destination blobs that already exist. 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 this example, we set CreationMode to OverwriteIfExists
to overwrite the destination blob if it already exists. 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. You can use the ProvidersForResuming
property of the TransferManagerOptions class to specify the providers.
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. If you don't know the transfer ID value, you can call TransferManager.GetTransfersAsync to find the transfer and its corresponding ID.
L'esempio di codice seguente illustra come riprendere un trasferimento:
TransferOperation resumedTransfer = await transferManager.ResumeTransferAsync(transferId: ID);
Note
The location of the persisted transfer data is different than the default location if TransferCheckpointStoreOptions is set as part of 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 . You can also call TransferManager.GetTransfersAsync to enumerate all transfers for a TransferManager
object.
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 defines the status of the transfer job.
TransferStatus
include le proprietà seguenti:
Property | Type | Description |
---|---|---|
HasCompletedSuccessfully |
Boolean | Rappresenta se il trasferimento viene completato correttamente senza errori o elementi ignorati. |
HasFailedItems |
Boolean | 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 |
Boolean | 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. It's possible to never have any items skipped if SkipIfExists isn't enabled in TransferOptions.CreationMode. |
State |
TransferState | Definisce i tipi di stato che un trasferimento può avere. See TransferState for details. |
Esempio: Monitorare lo stato di avanzamento del trasferimento usando TransferOptions
eventi
You can monitor transfer progress by listening for events provided by the TransferOptions class. The TransferOptions
instance is passed to the StartTransferAsync
method and provides events that are triggered when a transfer completes, fails, is skipped, or changes status.
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
For applications with existing code that uses the BlobContainerClient
class from Azure.Storage.Blobs, you can use extension methods to start transfers directly from a BlobContainerClient
object. The extension methods are provided in the BlobContainerClientExtensions class (or ShareDirectoryClientExtensions for Azure Files), and provide some of the benefits of using TransferManager
with minimal code changes. In questa sezione si apprenderà come usare i metodi di estensione per eseguire trasferimenti da un BlobContainerClient
oggetto .
Install the Azure.Storage.Blobs package if you don't have it already:
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.
Next step
- Code samples for DataMovement.Blobs and DataMovement.Files.Shares are available in the Azure SDK for .NET GitHub repository.