使用 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");

連線到帳戶

若要使用此文章中的程式碼片段,您必須建立代表儲存體帳戶的 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) 來連線

您可以使用適用於 JS 的 Azure 身分識別用戶端程式庫 (英文),向 Azure AD 驗證您的應用程式。

此範例使用用戶端識別碼、用戶端密碼與租用戶識別碼來建立 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;
}

注意

如需更多範例,請參閱適用於 JS 的 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}`);
  }

}

另請參閱