Управление каталогами и файлами в Azure Data Lake Storage 2-го поколения с помощью пакета SDK для JavaScript в Node.js

В этой статье показано, как использовать Node.js для создания каталогов и файлов в учетных записях хранения с иерархическим пространством имен, а также управления ими.

Дополнительные сведения о получении, установке и обновлении списков управления доступом (ACL) для каталогов и файлов см. в разделе Использование пакета SDK для JavaScript для управления списками ACL в Azure Data Lake Storage 2-го поколения.

Пакет (диспетчер пакетов узла) | Примеры | Обратная связь

Предварительные требования

  • Подписка Azure. См. страницу бесплатной пробной версии Azure.

  • Учетная запись хранения, в которой включено иерархическое пространство имен. Выполните эти инструкции, чтобы создать учетную запись.

  • Если вы используете этот пакет в приложении Node.js, потребуется Node.js 8.0.0 или более поздней версии.

Настройка проекта

Установите клиентскую библиотеку Data Lake для JavaScript. Для этого откройте окно терминала и введите приведенную ниже команду.

npm install @azure/storage-file-datalake

Импортируйте пакет storage-file-datalake, разместив этот оператор в верхней части файла кода.

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

Подключение к учетной записи

Чтобы использовать фрагменты кода из этой статьи, необходимо создать экземпляр DataLakeServiceClient, представляющий учетную запись хранения.

Подключение с помощью ключа учетной записи

Это самый простой способ подключения к учетной записи.

В этом примере экземпляр DataLakeServiceClient создается с помощью ключа учетной записи.


function GetDataLakeServiceClient(accountName, accountKey) {

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

  return datalakeServiceClient;             
}      

Примечание

Этот метод авторизации применим только к приложениям Node.js. Если вы планируете выполнять код в браузере, вы можете авторизоваться с помощью Azure Active Directory (Azure AD).

Подключение с помощью Azure Active Directory (Azure AD)

Для проверки подлинности приложения в Azure AD можно использовать Клиентскую библиотеку удостоверений Azure для JS.

В этом примере экземпляр DataLakeServiceClient создается с использованием идентификатора клиента, секрета клиента и идентификатора арендатора. Получение этих значений описано в статье Получение маркера безопасности из Azure AD для авторизации запросов из клиентского приложения.

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;             
}

Примечание

Дополнительные примеры см. в документации по клиентской библиотеке удостоверений Azure для JS.

Создание контейнера

Контейнер выступает в качестве файловой системы для файлов. Его можно создать, получив экземпляр FileSystemClient, а затем вызвав метод FileSystemClient.Create.

В этом примере создается контейнер с именем my-file-system.

async function CreateFileSystem(datalakeServiceClient) {

  const fileSystemName = "my-file-system";
  
  const fileSystemClient = datalakeServiceClient.getFileSystemClient(fileSystemName);

  const createResponse = await fileSystemClient.create();
        
}

Создание каталога

Создайте ссылку на каталог, получив экземпляр DirectoryClient, а затем вызвав метод DirectoryClient.create.

В этом примере в контейнер добавляется каталог с именем my-directory.

async function CreateDirectory(fileSystemClient) {
   
  const directoryClient = fileSystemClient.getDirectoryClient("my-directory");
  
  await directoryClient.create();

}

Переименование или перемещение каталога

Переименуйте или переместите каталог, вызвав метод DirectoryClient.rename. Укажите путь к нужному каталогу.

В этом примере подкаталог переименовывается в my-directory-renamed.

async function RenameDirectory(fileSystemClient) {

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

}

В этом примере каталог с именем my-directory-renamed перемещается в подкаталог каталога с именем my-directory-2.

async function MoveDirectory(fileSystemClient) {

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

}

Удаление каталога

Удалите каталог, вызвав метод DirectoryClient.delete.

В этом примере удаляется каталог my-directory.

async function DeleteDirectory(fileSystemClient) {

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

}

Отправка файла в каталог

Сначала считайте файл. В этом примере используется модуль Node.js fs. Затем создайте ссылку на файл в целевом каталоге, создав экземпляр FileClient, а затем вызвав метод FileClient.create. Отправьте файл, вызвав метод FileClient.append. Обязательно завершите передачу, вызвав метод FileClient.flush.

В этом примере текстовый файл отправляется в каталог 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);

}

Скачивание из каталога

Сначала создайте экземпляр FileSystemClient, представляющий файл, который требуется скачать. Для чтения файла используйте метод FileSystemClient.read. Затем запишите файл. В этом примере для этого используется модуль Node.js fs.

Примечание

Этот метод загрузки файла работает только для приложений Node.js. Если вы планируете выполнять код в браузере, пример этого приведен в файле сведений Клиентская библиотека Azure Storage File Data Lake для JavaScript.

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;
  });
}

Вывод содержимого каталогов

В этом примере выводятся имена каждого каталога и файла, расположенных в каталоге с именем 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}`);
  }

}

См. также раздел