Usar o SDK do JavaScript em Node.js para gerenciar diretórios e arquivos no Azure Data Lake Storage Gen2

Este artigo mostra como usar o Node.js para criar e gerenciar diretórios e arquivos nas contas de armazenamento que têm um namespace hierárquico.

Para saber mais sobre como obter, definir e atualizar as ACLs (listas de controle de acesso) de diretórios e arquivos, confira Usar o SDK do JavaScript no Node.js para gerenciar ACLs no Azure Data Lake Storage Gen2.

Pacote (Gerenciador de pacotes do Node) | Exemplos | Enviar comentários

Pré-requisitos

  • Uma assinatura do Azure. Para obter mais informações, confira Obter a avaliação gratuita do Azure.

  • Uma conta de armazenamento precisa ter o namespace hierárquico habilitado. Siga estas instruções para criar um.

  • Para usar o pacote em um aplicativo Node.js, você precisa do Node.js 8.0.0 ou superior.

Configurar o seu projeto

Instale biblioteca de clientes do Data Lake para JavaScript abrindo uma janela de terminal e, em seguida, digitando o comando a seguir.

npm install @azure/storage-file-datalake

Importe o pacote storage-file-datalake colocando essa instrução na parte superior do seu arquivo de código.

const {
AzureStorageDataLake,
DataLakeServiceClient,
StorageSharedKeyCredential
} = require("@azure/storage-file-datalake");

Conectar à conta

Para usar os trechos de código neste artigo, será necessário criar uma instância de DataLakeServiceClient que representa a conta de armazenamento.

Conectar-se usando uma chave de conta

Essa é a maneira mais fácil de se conectar a uma conta.

Este exemplo cria uma instância de DataLakeServiceClient usando uma chave de conta.


function GetDataLakeServiceClient(accountName, accountKey) {

  const sharedKeyCredential =
     new StorageSharedKeyCredential(accountName, accountKey);

  const datalakeServiceClient = new DataLakeServiceClient(
      `https://${accountName}.dfs.core.windows.net`, sharedKeyCredential);

  return datalakeServiceClient;
}

Observação

Esse método de autorização funciona apenas para aplicativos Node.js. Se planeja executar seu código em um navegador, é possível autorizar usando o Azure Active Directory (Azure AD).

Conectar-se usando o Microsoft Azure Active Directory (Azure AD)

É possível usar a biblioteca de clientes de identidade do Azure para JS para autenticar seu aplicativo com o Azure AD.

Este exemplo cria uma instância de DataLakeServiceClient usando uma ID do cliente, um segredo do cliente e uma ID de locatário. Para fazer isso, confira Adquirir um token do Azure AD para autorizar solicitações de um aplicativo cliente.

function GetDataLakeServiceClientAD(accountName, clientID, clientSecret, tenantID) {

  const credential = new ClientSecretCredential(tenantID, clientID, clientSecret);

  const datalakeServiceClient = new DataLakeServiceClient(
      `https://${accountName}.dfs.core.windows.net`, credential);

  return datalakeServiceClient;
}

Observação

Para obter mais exemplos, consulte a documentação da biblioteca de clientes de identidade do Azure para JS.

Criar um contêiner

Um contêiner atua como um sistema de arquivos para seus arquivos. Para criar um, obtenha uma instância de FileSystemClient e chame o método FileSystemClient.Create.

Este exemplo cria um contêiner chamado my-file-system.

async function CreateFileSystem(datalakeServiceClient) {

  const fileSystemName = "my-file-system";

  const fileSystemClient = datalakeServiceClient.getFileSystemClient(fileSystemName);

  const createResponse = await fileSystemClient.create();

}

Criar um diretório

Para criar uma referência de diretório, obtenha uma instância de DirectoryClient e chame o método DirectoryClient.Create.

Este exemplo adiciona um diretório chamado my-directory a um contêiner.

async function CreateDirectory(fileSystemClient) {

  const directoryClient = fileSystemClient.getDirectoryClient("my-directory");

  await directoryClient.create();

}

Renomear ou mover um diretório

Renomeie ou mova um diretório chamando o método DirectoryClient.rename. Passe o caminho do diretório desejado em um parâmetro.

Este exemplo renomeia um subdiretório para o nome my-directory-renamed.

async function RenameDirectory(fileSystemClient) {

  const directoryClient = fileSystemClient.getDirectoryClient("my-directory");
  await directoryClient.move("my-directory-renamed");

}

Este exemplo move um diretório chamado my-directory-renamed para um subdiretório de um diretório chamado my-directory-2.

async function MoveDirectory(fileSystemClient) {

  const directoryClient = fileSystemClient.getDirectoryClient("my-directory-renamed");
  await directoryClient.move("my-directory-2/my-directory-renamed");

}

Excluir um diretório

Para excluir um diretório, chame o método DirectoryClient.delete.

Este exemplo exclui um diretório chamado my-directory.

async function DeleteDirectory(fileSystemClient) {

  const directoryClient = fileSystemClient.getDirectoryClient("my-directory");
  await directoryClient.delete();

}

Carregar um arquivo em um diretório

Primeiro, leia um arquivo. Este exemplo usa o módulo do Node.js fs. Depois, para criar uma referência de arquivo no diretório de destino, crie uma instância de FileClient e chame o método FileClient.create. Para carregar um arquivo, chame o método FileClient.append. Para concluir o upload, chame o método FileClient.flush.

Este exemplo carrega um arquivo de texto para um diretório chamado my-directory.

async function UploadFile(fileSystemClient) {

  const fs = require('fs')

  var content = "";

  fs.readFile('mytestfile.txt', (err, data) => {
      if (err) throw err;

      content = data.toString();

  })

  const fileClient = fileSystemClient.getFileClient("my-directory/uploaded-file.txt");
  await fileClient.create();
  await fileClient.append(content, 0, content.length);
  await fileClient.flush(content.length);

}

Baixar de um diretório

Primeiro, crie uma instância de FileSystemClient que representa o arquivo que você deseja baixar. Use o método FileSystemClient.read para ler o arquivo. Em seguida, grave o arquivo. Este exemplo usa o módulo do Node.js fs para fazer isso.

Observação

Esse método de baixar um arquivo funciona apenas para aplicativos Node.js. Para executar o código em um navegador, confira o arquivo leia-me da biblioteca de clientes do File Data Lake do Armazenamento do Azure para JavaScript para ver um exemplo de como fazer isso em um navegador.

async function DownloadFile(fileSystemClient) {

  const fileClient = fileSystemClient.getFileClient("my-directory/uploaded-file.txt");

  const downloadResponse = await fileClient.read();

  const downloaded = await streamToString(downloadResponse.readableStreamBody);

  async function streamToString(readableStream) {
    return new Promise((resolve, reject) => {
      const chunks = [];
      readableStream.on("data", (data) => {
        chunks.push(data.toString());
      });
      readableStream.on("end", () => {
        resolve(chunks.join(""));
      });
      readableStream.on("error", reject);
    });
  }

  const fs = require('fs');

  fs.writeFile('mytestfiledownloaded.txt', downloaded, (err) => {
    if (err) throw err;
  });
}

Listar conteúdo do diretório

Este exemplo, imprime os nomes de cada diretório e arquivo localizado em um diretório chamado my-directory.

async function ListFilesInDirectory(fileSystemClient) {

  let i = 1;

  let iter = await fileSystemClient.listPaths({path: "my-directory", recursive: true});

  for await (const path of iter) {

    console.log(`Path ${i++}: ${path.name}, is directory: ${path.isDirectory}`);
  }

}

Confira também