Compartilhar via


Desenvolvimento para o Arquivos do Azure com Java

Saiba como desenvolver aplicativos Java que usam arquivos do Azure para armazenar dados. Os Arquivos do Azure são um serviço de compartilhamento de arquivos gerenciado na nuvem. Ele fornece compartilhamentos de arquivos totalmente gerenciados que são acessíveis por meio dos protocolos SMB (Bloco de Mensagens do Servidor) padrão do setor e NFS (Sistema de Arquivos de Rede). Os Arquivos do Azure também fornecem uma API REST para acesso programático a compartilhamentos de arquivos.

Neste artigo, você aprenderá sobre as diferentes abordagens para desenvolver com os Arquivos do Azure em Java e como escolher a abordagem que melhor atende às necessidades do seu aplicativo. Você também aprenderá a criar um aplicativo de console básico que interage com os recursos dos Arquivos do Azure.

Aplica-se a

Modelo de gestão Modelo de cobrança Camada de mídia Redundancy SMB NFS
Microsoft.Storage Provisionado v2 HDD (padrão) Local (LRS) Sim Não
Microsoft.Storage Provisionado v2 HDD (padrão) Zona (ZRS) Sim Não
Microsoft.Storage Provisionado v2 HDD (padrão) Localização geográfica (GRS) Sim Não
Microsoft.Storage Provisionado v2 HDD (padrão) GeoZone (GZRS) Sim Não
Microsoft.Storage Provisionado v1 SSD (de alta qualidade) Local (LRS) Sim Não
Microsoft.Storage Provisionado v1 SSD (de alta qualidade) Zona (ZRS) Sim Não
Microsoft.Storage Pago conforme o uso HDD (padrão) Local (LRS) Sim Não
Microsoft.Storage Pago conforme o uso HDD (padrão) Zona (ZRS) Sim Não
Microsoft.Storage Pago conforme o uso HDD (padrão) Localização geográfica (GRS) Sim Não
Microsoft.Storage Pago conforme o uso HDD (padrão) GeoZone (GZRS) Sim Não

Sobre o desenvolvimento de aplicativos Java com arquivos do Azure

Os Arquivos do Azure oferecem várias maneiras para os desenvolvedores Java acessarem dados e gerenciarem recursos nos Arquivos do Azure. A tabela a seguir lista as abordagens, resume como elas funcionam e fornece diretrizes sobre quando usar cada abordagem:

Abordagem Como funciona Quando usar
Bibliotecas de E/S de arquivo padrão Usa chamadas de API no nível do sistema operacional por meio de compartilhamentos de arquivos do Azure montados usando SMB ou NFS. Ao montar um compartilhamento de arquivos usando SMB/NFS, você pode usar bibliotecas de E/S de arquivo para uma estrutura ou linguagem de programação, como java.io e java.nio para Java. Você tem aplicativos de linha de negócios com código existente que usa E/S de arquivo padrão e não deseja reescrever o código para que o aplicativo funcione com um compartilhamento de arquivos do Azure.
FileREST API Acessa diretamente os pontos de extremidade HTTPS para interagir com os dados armazenados nos Arquivos do Azure. Fornece controle programático sobre recursos de compartilhamento de arquivos. O SDK do Azure fornece a biblioteca de clientes de Compartilhamentos de Arquivos (com.azure.storage.file.share) que se baseia na API FileREST, permitindo que você interaja com as operações da API FileREST por meio de paradigmas familiares da linguagem de programação Java. Você está criando aplicativos e serviços de nuvem com valor agregado para clientes e deseja usar recursos avançados não disponíveis por meio de bibliotecas de E/S de arquivo padrão.
API REST do provedor de recursos de armazenamento Usa o ARM (Azure Resource Manager) para gerenciar contas de armazenamento e compartilhamentos de arquivos. Chama os pontos de extremidade da API REST para várias operações de gerenciamento de recursos. Seu aplicativo ou serviço precisa executar tarefas de gerenciamento de recursos, como criar, excluir ou atualizar contas de armazenamento ou compartilhamentos de arquivos.

Para obter informações gerais sobre essas abordagens, consulte Visão geral do desenvolvimento de aplicativos com arquivos do Azure.

Este artigo se concentra em trabalhar com recursos de Arquivos do Azure usando as seguintes abordagens:

Pré-requisitos

Configure seu ambiente

Observação

Este artigo usa a ferramenta de build do Maven para criar e executar o código de exemplo. Outras ferramentas de build, como o Gradle, também funcionam com o SDK do Azure para Java.

Use o Maven para criar um novo aplicativo de console ou abrir um projeto existente. Siga estas etapas para instalar pacotes e adicionar as diretivas necessárias import .

Instalar pacotes

Abra o arquivo pom.xml no seu editor de texto. Instale os pacotes incluindo o arquivo BOM ou incluindo uma dependência direta.

Incluir o arquivo da BOM

Adicione azure-sdk-bom para assumir uma dependência da versão mais recente da biblioteca. No snippet a seguir, substitua o marcador {bom_version_to_target} pelo número de versão. O uso do azure-sdk-bom impede que você precise especificar a versão de cada dependência individual. Para saber mais sobre o BOM, consulte o BOM README do SDK do Azure.

<dependencyManagement>
    <dependencies>
        <dependency>
            <groupId>com.azure</groupId>
            <artifactId>azure-sdk-bom</artifactId>
            <version>{bom_version_to_target}</version>
            <type>pom</type>
            <scope>import</scope>
        </dependency>
    </dependencies>
</dependencyManagement>

Adicione os seguintes elementos de dependência ao grupo de dependências. A dependência azure-identity é necessária para conexões sem senha com os serviços do Azure. Observe que os artefatos do gerenciador de recursos não estão incluídos no arquivo BOM, portanto, você precisa adicioná-los como dependências diretas.

<dependency>
  <groupId>com.azure</groupId>
  <artifactId>azure-storage-file-share</artifactId>
</dependency>
<dependency>
  <groupId>com.azure</groupId>
  <artifactId>azure-identity</artifactId>
</dependency>
<dependency>
  <groupId>com.azure</groupId>
  <artifactId>azure-core-management</artifactId>
</dependency>
<dependency>
  <groupId>com.azure.resourcemanager</groupId>
  <artifactId>azure-resourcemanager</artifactId>
  <version>{package_version_to_target}</version>
</dependency>
<dependency>
  <groupId>com.azure.resourcemanager</groupId>
  <artifactId>azure-resourcemanager-storage</artifactId>
  <version>{package_version_to_target}</version>
</dependency>

Incluir uma dependência direta

Para estabelecer dependência de uma versão específica da biblioteca, adicione a dependência direta ao seu projeto:

<dependency>
  <groupId>com.azure</groupId>
  <artifactId>azure-storage-file-share</artifactId>
  <version>{package_version_to_target}</version>
</dependency>
<dependency>
  <groupId>com.azure</groupId>
  <artifactId>azure-identity</artifactId>
  <version>{package_version_to_target}</version>
</dependency>
<dependency>
  <groupId>com.azure.resourcemanager</groupId>
  <artifactId>azure-resourcemanager</artifactId>
  <version>{package_version_to_target}</version>
</dependency>
<dependency>
  <groupId>com.azure.resourcemanager</groupId>
  <artifactId>azure-resourcemanager-storage</artifactId>
  <version>{package_version_to_target}</version>
</dependency>
<dependency>
  <groupId>com.azure</groupId>
  <artifactId>azure-core-management</artifactId>
  <version>{package_version_to_target}</version>
</dependency>

Incluir diretivas de importação

Em seguida, abra o arquivo de código e adicione as diretivas necessárias import . Neste exemplo, adicionamos as seguintes diretivas no arquivo App.java :

import com.azure.identity.*;
import com.azure.storage.file.share.*;
import com.azure.resourcemanager.*;
import com.azure.resourcemanager.storage.models.*;
import com.azure.core.management.*;
import com.azure.core.management.profile.*;

Se você planeja usar as bibliotecas de E/S de arquivo Java, também precisará adicionar as seguintes diretivas de importação:

import java.io.*;
import java.nio.file.*;

Trabalhar com arquivos do Azure usando bibliotecas de E/S de arquivo Java

As bibliotecas de E/S de arquivo padrão são a maneira mais comum de acessar e trabalhar com recursos de Arquivos do Azure. Quando você monta um compartilhamento de arquivos usando SMB ou NFS, seu sistema operacional redireciona solicitações de API para o sistema de arquivos local. Essa abordagem permite que você use bibliotecas de E/S de arquivo padrão, como java.io e java.nio, para interagir com arquivos e diretórios no compartilhamento.

Considere usar bibliotecas de Entrada/Saída de arquivo em Java quando seu aplicativo exigir:

  • Compatibilidade do aplicativo: Ideal para aplicativos de linha de negócios com código existente que já usa bibliotecas de E/S de arquivo Java. Você não precisa reescrever o código para que o aplicativo funcione com um compartilhamento de arquivos do Azure.
  • Facilidade de uso: As bibliotecas de E/S de arquivo Java são bem conhecidas pelos desenvolvedores e fáceis de usar. Uma proposta de valor chave dos Arquivos do Azure é que ele expõe APIs nativas do sistema de arquivos por meio de SMB e NFS.

Nesta seção, você aprenderá a usar bibliotecas de E/S de arquivo Java para trabalhar com recursos de Arquivos do Azure.

Para obter mais informações e exemplos, consulte o seguinte recurso:

Montar um compartilhamento de arquivos

Para usar bibliotecas de E/S de arquivo Java, primeiro você deve montar um compartilhamento de arquivos. Consulte os seguintes recursos para obter diretrizes sobre como montar um compartilhamento de arquivos usando SMB ou NFS:

Neste artigo, usamos o seguinte caminho para fazer referência a um compartilhamento de arquivos SMB montado no Windows:

String fileSharePath = "Z:\\file-share";

Exemplo: conectar-se a um compartilhamento de arquivos e enumerar diretórios usando bibliotecas de E/S de arquivo Java

O exemplo de código a seguir mostra como se conectar a um compartilhamento de arquivos e listar os diretórios no compartilhamento:

import java.io.*;
import java.nio.file.*;

// Add the following code to a new or existing function

String fileSharePath = "Z:\\file-share";

try {
    File directory = new File(fileSharePath);
    File[] dirs = directory.listFiles(File::isDirectory);
            
    if (dirs != null) {
        for (File dir : dirs) {
            System.out.println(dir.getName());
        }
        System.out.println(dirs.length + " directories found.");
    }
} catch (Exception e) {
    System.out.println("Error: " + e.getMessage());
}

Exemplo: gravar um arquivo em um compartilhamento de arquivos usando bibliotecas de E/S de arquivo do Java

O exemplo de código a seguir mostra como gravar e acrescentar texto a um arquivo:

import java.io.*;
import java.nio.file.*;
import java.util.Arrays;

// Add the following code to a new or existing function

String fileSharePath = "Z:\\file-share";
String fileName = "test.txt";

try {
    String textToWrite = "First line" + System.lineSeparator();
    Path filePath = Paths.get(fileSharePath, fileName);
        
    // Write initial content to file
    Files.write(filePath, textToWrite.getBytes());
    System.out.println("Initial text written to file");
        
    // Append additional lines to the file
    String[] textToAppend = { "Second line", "Third line" };
    Files.write(filePath, 
                Arrays.asList(textToAppend),
                StandardOpenOption.APPEND);
    System.out.println("Additional lines appended to file");
} catch (IOException ex) {
    System.out.println("Error writing to file: " + ex.getMessage());
}

Exemplo: bloquear um arquivo em um compartilhamento de arquivos usando bibliotecas de E/S de arquivo Java

Os clientes SMB que montam compartilhamentos de arquivos podem usar mecanismos de bloqueio do sistema de arquivos para gerenciar o acesso a arquivos compartilhados.

O exemplo de código a seguir mostra como bloquear um arquivo em um compartilhamento de arquivos:

import java.io.*;
import java.nio.channels.FileChannel;
import java.nio.channels.FileLock;
import java.nio.file.*;

// Add the following code to a new or existing function

String fileSharePath = "Z:\\file-share";
String fileName = "test.txt";
String filePath = Paths.get(fileSharePath, fileName).toString();

try (
    FileOutputStream fos = new FileOutputStream(filePath);
    FileChannel fileChannel = fos.getChannel()) {

    // Acquire an exclusive lock on this file
    FileLock lock = fileChannel.lock();

    System.out.println("File is locked.");

    // Perform file operations here

    // Release the lock
    lock.release();
    System.out.println("File lock released.");

} catch (Exception e) {
    e.printStackTrace();
}

Ao usar o SMB e a API FileREST, tenha em mente que a API FileREST usa concessões para gerenciar bloqueios de arquivos, enquanto o SMB usa bloqueios do sistema de arquivos gerenciados pelo sistema operacional. Para saber mais sobre como gerenciar interações de bloqueio de arquivos entre o SMB e a API FileREST, consulte Gerenciar bloqueios de arquivo.

Exemplo: Enumerar ACLs de arquivo usando bibliotecas de E/S de arquivo Java

O exemplo de código a seguir mostra como enumerar ACLs (listas de controle de acesso) para um arquivo:

import java.nio.file.*;
import java.nio.file.attribute.AclEntry;
import java.nio.file.attribute.AclFileAttributeView;
import java.util.List;

// Add the following code to a new or existing function

String fileSharePath = "Z:\\file-share";
String fileName = "test.txt";
String filePath = Paths.get(fileSharePath, fileName).toString();

try {
    Path path = Paths.get(filePath);

    // Get the ACL view for the file
    AclFileAttributeView aclView = Files.getFileAttributeView(
            path, AclFileAttributeView.class);

    // Get the ACL entries
    List<AclEntry> aclEntries = aclView.getAcl();

    // List all access rules for the file
    for (AclEntry entry : aclEntries) {
        System.out.println("Identity: " + entry.principal().getName());
        System.out.println("Access Control Type: " + entry.type());
        System.out.println("File System Rights: " + entry.permissions());
        System.out.println();
    }

    System.out.println(aclEntries.size() + " ACL entries found.");
} catch (Exception ex) {
    System.out.println("Error: " + ex.getMessage());
}

Trabalhar com arquivos do Azure usando a biblioteca de clientes de Compartilhamentos de Arquivos para Java

A API FileREST fornece acesso programático aos Arquivos do Azure. Ele permite que você chame os pontos de extremidade HTTPS para realizar operações em compartilhamentos de arquivos, diretórios e arquivos. A API FileREST foi projetada para alta escalabilidade e recursos avançados que podem não estar disponíveis por meio de protocolos nativos. O SDK do Azure fornece bibliotecas de clientes, como a biblioteca de clientes Compartilhamentos de Arquivos para Java, que se baseiam na API FileREST.

Considere usar a API FileREST e a biblioteca de clientes do Compartilhamento de Arquivos se o aplicativo exigir:

  • Recursos avançados: Acessar operações e recursos que não estão disponíveis por meio de protocolos nativos.
  • Integrações de nuvem personalizadas: Crie serviços personalizados de valor agregado, como backup, antivírus ou gerenciamento de dados, que interagem diretamente com os Arquivos do Azure.
  • Otimização de desempenho: Aproveite as vantagens de desempenho em cenários de alta escala usando operações de plano de dados.

A API FileREST modela os Arquivos do Azure como uma hierarquia de recursos e é recomendada para operações executadas no nível do diretório ou do arquivo . Você deve preferir a API REST do provedor de recursos de armazenamento para operações executadas no nível de compartilhamento de arquivos ou serviço de arquivo.

Nesta seção, você aprenderá a usar a biblioteca de clientes de Compartilhamentos de Arquivos para Java para trabalhar com recursos de Arquivos do Azure.

Para obter mais informações e exemplos, consulte os seguintes recursos:

Autorizar o acesso e criar um cliente

Para conectar um aplicativo aos Arquivos do Azure, crie um ShareClient objeto. Esse objeto é o ponto de partida para trabalhar com recursos de Arquivos do Azure. Os exemplos de código a seguir mostram como criar um ShareClient objeto usando diferentes mecanismos de autorização.

Para autorizar com o Microsoft Entra ID, você precisará usar uma entidade de segurança. Que tipo de principal de segurança você precisa depende de onde seu aplicativo é executado. Para saber mais sobre cenários de autenticação, consulte a autenticação do Azure com o Java e a Identidade do Azure.

Para trabalhar com os exemplos de código neste artigo, atribua a função interna do RBAC do Azure Contribuidor Privilegiado de Dados do Arquivo de Armazenamento à entidade de segurança. Essa função fornece acesso completo de leitura, gravação, modificação de ACLs e exclusão de todos os dados nos compartilhamentos para todas as contas de armazenamento configuradas, independentemente das permissões NTFS de nível de arquivo/diretório definidas. Para obter mais informações, consulte Acessar compartilhamentos de arquivos do Azure usando Microsoft Entra ID com OAuth do Azure Files via REST.

Autorizar o acesso usando DefaultAzureCredential

Uma maneira fácil e segura de autorizar o acesso e se conectar aos Arquivos do Azure é obter um token OAuth criando uma instância DefaultAzureCredential . Em seguida, você pode usar essa credencial para criar um ShareClient objeto.

O exemplo a seguir cria um ShareClient objeto autorizado usando DefaultAzureCredentiale, em seguida, cria um ShareDirectoryClient objeto para trabalhar com um diretório no compartilhamento:

import com.azure.core.credential.TokenCredential;
import com.azure.identity.DefaultAzureCredentialBuilder;
import com.azure.storage.file.share.*;

// Add the following code to a new or existing function

String accountName = "<account-name>";
String shareName = "<share-name>";
TokenCredential defaultAzureCredential = new DefaultAzureCredentialBuilder().build();

// Create the ShareClient
ShareClient shareClient = new ShareClientBuilder()
    .endpoint(String.format("https://%s.file.core.windows.net", accountName))
    .shareName(shareName)
    .credential(defaultAzureCredential)
    .buildClient();

// Create a client to interact with a directory in the share
ShareDirectoryClient directoryClient = shareClient.getDirectoryClient("sample-directory");

Se você souber exatamente qual tipo de credencial você usa para autenticar usuários, poderá obter um token OAuth usando outras classes na biblioteca de clientes da Identidade do Azure para Java. Essas classes derivam da classe TokenCredential .

Para saber mais sobre cada um desses mecanismos de autorização, consulte Escolher como autorizar o acesso aos dados do arquivo.

Exemplo: Copiar arquivos usando a biblioteca cliente de Compartilhamento de Arquivos

Você pode copiar arquivos em um compartilhamento de arquivos ou entre compartilhamentos de arquivos usando o seguinte método:

Você pode copiar um arquivo para um blob de destino usando o seguinte método de um BlockBlobClient objeto:

O exemplo de código a seguir mostra como copiar um arquivo para um arquivo em outro compartilhamento de arquivos:

import java.time.*;
import java.util.*;

import com.azure.core.credential.TokenCredential;
import com.azure.core.util.polling.*;
import com.azure.identity.DefaultAzureCredentialBuilder;
import com.azure.storage.file.share.*;
import com.azure.storage.file.share.models.*;

// Add the following code to a new or existing function

String accountName = "<account-name>";
String srcShareName = "src-file-share";
String destShareName = "dest-file-share";
String srcFilePath = "src/path/to/file";
String destFilePath = "dest/path/to/file";

TokenCredential tokenCredential = new DefaultAzureCredentialBuilder().build();

ShareFileClient srcShareFileClient = new ShareFileClientBuilder()
    .endpoint(String.format("https://%s.file.core.windows.net", accountName))
    .shareName(srcShareName)
    .shareTokenIntent(ShareTokenIntent.BACKUP)
    .resourcePath(srcFilePath)
    .credential(defaultAzureCredential)
    .buildFileClient();

ShareFileClient destShareFileClient = new ShareFileClientBuilder()
    .endpoint(String.format("https://%s.file.core.windows.net", accountName))
    .shareName(destShareName)
    .shareTokenIntent(ShareTokenIntent.BACKUP)
    .resourcePath(destFilePath)
    .credential(defaultAzureCredential)
    .buildFileClient();

// Copy the file from the source share to the destination share
SyncPoller<ShareFileCopyInfo, Void> poller = destShareFileClient
        .beginCopy(srcShareFileClient.getFileUrl(),
                Collections.singletonMap("file", "metadata"),
                Duration.ofSeconds(2));

final PollResponse<ShareFileCopyInfo> pollResponse = poller.poll();
final ShareFileCopyInfo value = pollResponse.getValue();
System.out.printf("Copy source: %s. Status: %s.%n", value.getCopySourceUrl(), value.getCopyStatus());

Exemplo: alugar um arquivo usando a biblioteca de clientes de Compartilhamentos de Arquivos

Uma concessão cria um bloqueio em um arquivo gerenciado pelo Azure por meio de uma ID de concessão. A concessão fornece um mecanismo para coordenar o acesso a arquivos em vários clientes em um sistema distribuído. Uma concessão em um arquivo fornece acesso exclusivo de gravação e exclusão. Para saber mais sobre estados e ações de locação, consulte Arquivo de Locação.

O exemplo de código a seguir mostra como criar um cliente de concessão, adquirir uma concessão de duração infinita em um arquivo e liberar a concessão:

import com.azure.core.credential.TokenCredential;
import com.azure.identity.DefaultAzureCredentialBuilder;
import com.azure.storage.file.share.*;
import com.azure.storage.file.share.models.*;
import com.azure.storage.file.share.specialized.*;

// Add the following code to a new or existing function

String accountName = "<account-name>";
String shareName = "sample-file-share";
String filePath = "path/to/file";
        
TokenCredential defaultAzureCredential = new DefaultAzureCredentialBuilder().build();

ShareFileClient fileClient = new ShareFileClientBuilder()
    .endpoint(String.format("https://%s.file.core.windows.net", accountName))
    .shareName(shareName)
    .shareTokenIntent(ShareTokenIntent.BACKUP)
    .resourcePath(filePath)
    .credential(defaultAzureCredential)
    .buildFileClient();

// Get a ShareLeaseClient
ShareLeaseClient fileLeaseClient = new ShareLeaseClientBuilder()
        .fileClient(fileClient)
        .shareTokenIntent(ShareTokenIntent.BACKUP)
        .buildClient();
        
try {
    // Acquire a lease on the file with infinite duration
    fileLeaseClient.acquireLease();
    System.out.println("Lease acquired successfully");
            
    // Do something with the file

} catch (Exception e) {
    System.err.println("Error: " + e.getMessage());
} finally {
    // Release the lease when finished
    try {
        fileLeaseClient.releaseLease();
        System.out.println("Lease released successfully.");
    } catch (Exception e) {
        System.err.println(e.getMessage());
    }
}

Ao usar o SMB e a API FileREST, tenha em mente que a API FileREST usa concessões para gerenciar bloqueios de arquivos, enquanto o SMB usa bloqueios do sistema de arquivos gerenciados pelo sistema operacional. Para saber mais sobre como gerenciar interações de bloqueio de arquivos entre o SMB e a API FileREST, consulte Gerenciar bloqueios de arquivo.

Exemplo: criar e listar instantâneos de compartilhamento usando a biblioteca de clientes Compartilhamentos de Arquivos

Os instantâneos de compartilhamento são cópias somente leitura de um compartilhamento de arquivos em um momento. Você pode criar um instantâneo de um compartilhamento de arquivos e, em seguida, usar o instantâneo para acessar os dados no compartilhamento no momento em que o instantâneo foi criado. Você também pode listar todos os instantâneos em um compartilhamento de arquivos e excluir instantâneos de compartilhamento.

O exemplo de código a seguir mostra como criar um instantâneo de compartilhamento, listar os instantâneos em um compartilhamento de arquivos e percorrer a árvore de diretório em um instantâneo de compartilhamento:

import com.azure.storage.file.share.*;
import com.azure.storage.file.share.models.*;

// Add the following code to a new or existing function

public static void main(String[] args) {
    String connectionString = "<connection-string>";

    // Create a ShareServiceClient from which you can create clients for specific shares
    ShareServiceClient shareServiceClient = new ShareServiceClientBuilder()
    .connectionString(connectionString)
        .buildClient();
        
    // Get a client for a specific share
    ShareClient shareClient = shareServiceClient.getShareClient("sample-file-share");

    try {
        // Create a snapshot
        ShareSnapshotInfo snapshotInfo = shareClient.createSnapshot();
        System.out.println("Snapshot created: " + snapshotInfo.getSnapshot());

        // List snapshots in a share
        ListSharesOptions options = new ListSharesOptions()
            .setIncludeSnapshots(true);
                
        for (ShareItem shareItem : shareServiceClient.listShares(options, null, null)) {
            if (shareItem.getSnapshot() != null) {
                System.out.println("Share: " + shareItem.getName() + 
                    " (Snapshot: " + shareItem.getSnapshot() + ")");
            }
        }

        // List directories and files in a share snapshot
        String snapshotTimestamp = snapshotInfo.getSnapshot();
        ShareClient shareSnapshot = shareClient.getSnapshotClient(snapshotTimestamp);
        ShareDirectoryClient rootDir = shareSnapshot.getRootDirectoryClient();

        listDirectoryTree(rootDir);
            
    } catch (Exception e) {
        System.err.println("Error: " + e.getMessage());
    }
 }
    
private static void listDirectoryTree(ShareDirectoryClient directory) {
    // List all files and directories in current directory
    for (ShareFileItem fileItem : directory.listFilesAndDirectories()) {
        if (fileItem.isDirectory()) {
            System.out.println("Directory: " + fileItem.getName());
            // Recursively list subdirectory contents
            listDirectoryTree(directory.getSubdirectoryClient(fileItem.getName()));
        } else {
            System.out.println("File: " + fileItem.getName());
        }
    }
}

Observação

Tokens OAuth, como os obtidos ao usar DefaultAzureCredential, não são permitidos para operações de plano de dados no nível de compartilhamento de arquivos. Para trabalhar com instantâneos de compartilhamento, o objeto cliente deve ser autorizado usando a chave da conta. O ShareClient objeto criado neste exemplo de código usa uma cadeia de conexão, que inclui a chave da conta.

Armazenar chaves de conta ou cadeias de conexão apresenta um risco de segurança. Você só deve usá-los quando a autenticação do Microsoft Entra não estiver disponível. Para saber mais sobre como armazenar chaves de conta com segurança no Azure Key Vault, consulte sobre as chaves da conta de armazenamento gerenciada do Azure Key Vault.

Gerenciar recursos de Arquivos do Azure usando as bibliotecas de gerenciamento do Armazenamento do Azure

As bibliotecas de gerenciamento do Armazenamento do Azure são criadas na API REST do provedor de recursos do Armazenamento do Azure. O provedor de recursos do Armazenamento do Azure é um serviço baseado no Azure Resource Manager e dá suporte a métodos declarativos (modelos) e imperativos (chamada direta à API). A API REST do provedor de recursos do Armazenamento do Azure fornece acesso programático aos recursos do Armazenamento do Azure, incluindo compartilhamentos de arquivos. O SDK do Azure fornece bibliotecas de gerenciamento que se baseiam na API REST do provedor de recursos do Armazenamento do Azure.

As bibliotecas de gerenciamento são recomendadas para operações realizadas no nível do serviço de arquivo ou no compartilhamento de arquivo. Nesta seção, você aprenderá a usar as bibliotecas de gerenciamento do Armazenamento do Azure para gerenciar recursos de Arquivos do Azure.

As bibliotecas de gerenciamento do Armazenamento do Azure são criadas na API REST do provedor de recursos do Armazenamento do Azure. O provedor de recursos do Armazenamento do Azure é um serviço baseado no Azure Resource Manager e dá suporte a métodos declarativos (modelos) e imperativos (chamada direta à API). A API REST do provedor de recursos do Armazenamento do Azure fornece acesso programático aos recursos do Armazenamento do Azure, incluindo compartilhamentos de arquivos. O SDK do Azure fornece bibliotecas de gerenciamento que se baseiam na API REST do provedor de recursos do Armazenamento do Azure.

As bibliotecas de gerenciamento são recomendadas para operações realizadas no nível do serviço de arquivo ou no compartilhamento de arquivo. Nesta seção, você aprenderá a usar as bibliotecas de gerenciamento do Armazenamento do Azure para gerenciar recursos de Arquivos do Azure.

Exemplo: criar um compartilhamento de arquivos usando a biblioteca de gerenciamento do Armazenamento do Azure

O exemplo de código a seguir mostra como criar um objeto de nível AzureResourceManager superior, registrar o provedor de recursos de armazenamento com uma assinatura e criar um compartilhamento de arquivos usando a biblioteca de gerenciamento do Armazenamento do Azure:

import com.azure.identity.*;
import com.azure.resourcemanager.*;
import com.azure.resourcemanager.storage.fluent.*;
import com.azure.resourcemanager.storage.fluent.models.*;

import com.azure.core.credential.TokenCredential;
import com.azure.core.management.*;
import com.azure.core.management.profile.*;

// Add the following code to a new or existing function

String subscriptionID = "<subscription-id>";
String rgName = "<resource-group-name>";
String saName = "<storage-account-name>";
TokenCredential credential = new DefaultAzureCredentialBuilder().build();
AzureProfile profile = new AzureProfile(AzureEnvironment.AZURE);

AzureResourceManager armClient = AzureResourceManager
        .configure()
        .authenticate(credential, profile)
        .withSubscription(subscriptionID);

// Check the registration state of the resource provider and register, if needed
if (armClient.providers().getByName("Microsoft.Storage").registrationState() == "NotRegistered")
    armClient.providers().register("Microsoft.Storage");

// Create a new file share

StorageManagementClient storageManagementClient = armClient.storageAccounts().manager().serviceClient();
FileSharesClient fileShare = storageManagementClient.getFileShares();

String shareName = "sample-file-share";
int quotaInGB = 1;
        
// Create the file share
fileShare.create(
    rgName,
    saName,
    shareName,
    new FileShareInner()
        .withShareQuota(quotaInGB)
);

Você pode configurar as propriedades de compartilhamento de arquivo usando a classe FileShareInner . O exemplo anterior mostra como definir a cota de compartilhamento ao criar o compartilhamento de arquivos. Para atualizar um compartilhamento de arquivos existente, chame fileShare.update() e passe o FileShareInner objeto com as propriedades que você deseja atualizar.

Observação

Para executar a operação de registro, você precisa de permissões para a seguinte ação do RBAC do Azure: Microsoft.Storage/register/action. A permissão está incluída nas funções internas de Colaborador e de Proprietário.

Exemplo: listar compartilhamentos de arquivo e instantâneos usando a biblioteca de gerenciamento do Azure Storage

O exemplo de código a seguir mostra como listar compartilhamentos de arquivos e instantâneos em uma conta de armazenamento:

import com.azure.identity.*;
import com.azure.resourcemanager.*;
import com.azure.resourcemanager.storage.fluent.*;
import com.azure.resourcemanager.storage.fluent.models.*;

import com.azure.core.credential.TokenCredential;
import com.azure.core.http.rest.PagedIterable;
import com.azure.core.management.*;
import com.azure.core.management.profile.*;
import com.azure.core.util.Context;

// Add the following code to a new or existing function

String subscriptionID = "<subscription-id>";
String rgName = "<resource-group-name>";
String saName = "<storage-account-name>";
TokenCredential credential = new DefaultAzureCredentialBuilder().build();
AzureProfile profile = new AzureProfile(AzureEnvironment.AZURE);

AzureResourceManager armClient = AzureResourceManager
        .configure()
        .authenticate(credential, profile)
        .withSubscription(subscriptionID);

// Check the registration state of the resource provider and register, if needed
if (armClient.providers().getByName("Microsoft.Storage").registrationState() == "NotRegistered")
    armClient.providers().register("Microsoft.Storage");

StorageManagementClient storageManagementClient = armClient.storageAccounts().manager().serviceClient();
FileSharesClient fileShare = storageManagementClient.getFileShares();

// List all file shares and include snapshots

PagedIterable<FileShareItemInner> fileShares = fileShare.list(
    rgName,               // resource group name
    saName,               // storage account name
    null,                 // maxpagesize
    null,                 // filter
    "snapshots",          // expand to include snapshots
    Context.NONE);        // context

for (FileShareItemInner fileShareItem : fileShares) {
    System.out.println("File share name: " + fileShareItem.name());
    System.out.println("File share quota: " + fileShareItem.shareQuota());
}

Próximas etapas

Para obter mais informações sobre como desenvolver com arquivos do Azure, consulte os seguintes recursos: