使用 Node.js 中的 JavaScript SDK 來管理 Azure Data Lake Storage Gen2 中的目錄和檔案

此文章說明如何使用 Node.js,在具有階層命名空間的儲存體帳戶中建立及管理目錄和檔案。

若要了解如何取得、設定及更新目錄和檔案的存取控制清單 (ACL),請參閱使用 Node.js 中的 JavaScript SDK 來管理 Azure Data Lake Storage Gen2 中的 ACL (部分機器翻譯)。

套件 (節點套件管理員) (英文) | 範例 (英文) | 提供意見反應 (英文)

必要條件

  • Azure 訂用帳戶。 如需詳細資訊,請參閱取得 Azure 免費試用

  • 已啟用階層命名空間的儲存體帳戶。 遵循下列指示以建立帳戶。

  • 如果您在 Node.js 應用程式中使用此套件,您將需要 Node.js 8.0.0 或更高版本。

設定您的專案

開啟終端視窗,然後輸入下列命令,以安裝適用於 JavaScript 的 Data Lake 用戶端程式庫。

npm install @azure/storage-file-datalake

將此陳述式放在程式碼檔案的頂端,以匯入 storage-file-datalake 套件。

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

注意

Data Lake 上的多重通訊協定存取 儲存體 可讓應用程式同時使用 Blob API 和 Data Lake 儲存體 Gen2 API,以使用已啟用階層命名空間 (HNS) 的記憶體帳戶中的數據。 使用 Data Lake 儲存體 Gen2 特有的功能時,例如目錄作業和 ACL,請使用 Data Lake 儲存體 Gen2 API,如本文所示。

選擇要在指定案例中使用的 API 時,請考慮應用程式的工作負載和需求,以及 HNS 對工作負載和應用程式的已知問題和影響。

連線到帳戶

若要使用此文章中的程式碼片段,您必須建立代表儲存體帳戶的 DataLakeServiceClient 執行個體。

使用 Microsoft Entra ID 進行連線

您可以使用適用於 JS 的 Azure 身分識別用戶端程式庫,以 Microsoft Entra ID 驗證應用程式。

建立 DataLakeServiceClient 執行個體,並傳入 DefaultAzureCredential 類別的新執行個體。

function GetDataLakeServiceClientAD(accountName) {

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

  return dataLakeServiceClient;
}

若要深入了解如何使用 DefaultAzureCredential 來授權存取資料,請參閱概觀:使用 Azure SDK 向 Azure 驗證 JavaScript 應用程式

使用帳戶金鑰來連線

您可以使用您的帳戶存取金鑰 (共用金鑰) 來授權存取資料。 此範例會建立以帳戶金鑰授權的 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 應用程式。 如果您打算在瀏覽器中執行程式碼,您可以使用 Microsoft Entra ID 進行授權。

警告

不建議使用「共用金鑰」來進行授權,因為它可能不太安全。 為了獲得最佳的安全性,請停用透過「共用金鑰」對您的儲存體帳戶進行授權,如「防止 Azure 儲存體帳戶的共用金鑰授權」中所述。

使用存取金鑰和連接字串應僅限於未存取生產或敏感性資料的初始概念證明應用程式或開發原型。 否則,在對 Azure 資源進行驗證時,應一律優先使用 Azure SDK 中所提供的權杖型驗證類別。

Microsoft 建議用戶端使用 Microsoft Entra ID 或共用存取簽章 (SAS) 來授權存取 Azure 儲存體中的資料。 如需詳細資訊,請參閱授權資料存取的作業

建立容器

容器可作為您檔案的檔案系統。 您可以透過取得 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 應用程式。 如果您想要在瀏覽器中執行程式碼,請參閱適用於 JavaScript 的 Azure Storage File Data Lake 用戶端程式庫 (英文) 讀我檔案,以取得如何在瀏覽器中執行此作業的範例。

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

}

另請參閱