當前位置: 首頁>>代碼示例 >>用法及示例精選 >>正文


Node.js fs.access(path[, mode], callback)用法及代碼示例


fs.access(path[, mode], callback)

曆史
版本變化
v18.0.0

將無效回調傳遞給 callback 參數現在會拋出 ERR_INVALID_ARG_TYPE 而不是 ERR_INVALID_CALLBACK

v7.6.0

path 參數可以是使用 file: 協議的 WHATWG URL 對象。

v6.3.0

fs.R_OK 等直接存在於 fs 上的常量已作為軟棄用移至 fs.constants 中。因此對於 Node.js < v6.3.0 使用 fs 來訪問這些常量,或者執行類似 (fs.constants || fs).R_OK 的操作來處理所有版本。

v0.11.15

添加於:v0.11.15


參數

測試用戶對 path 指定的文件或目錄的權限。 mode 參數是一個可選整數,用於指定要執行的可訪問性檢查。 mode 應該是值 fs.constants.F_OK 或由 fs.constants.R_OKfs.constants.W_OKfs.constants.X_OK 中的任何一個的按位或組成的掩碼(例如 fs.constants.W_OK | fs.constants.R_OK )。檢查 File access constants 以獲取 mode 的可能值。

最後一個參數 callback 是一個回調函數,使用可能的錯誤參數調用。如果任何可訪問性檢查失敗,錯誤參數將是一個Error 對象。以下示例檢查package.json 是否存在,以及它是否可讀或可寫。

import { access, constants } from 'node:fs';

const file = 'package.json';

// Check if the file exists in the current directory.
access(file, constants.F_OK, (err) => {
  console.log(`${file} ${err ? 'does not exist' : 'exists'}`);
});

// Check if the file is readable.
access(file, constants.R_OK, (err) => {
  console.log(`${file} ${err ? 'is not readable' : 'is readable'}`);
});

// Check if the file is writable.
access(file, constants.W_OK, (err) => {
  console.log(`${file} ${err ? 'is not writable' : 'is writable'}`);
});

// Check if the file is readable and writable.
access(file, constants.R_OK | constants.W_OK, (err) => {
  console.log(`${file} ${err ? 'is not' : 'is'} readable and writable`);
});

在調用 fs.open()fs.readFile()fs.writeFile() 之前,不要使用 fs.access() 檢查文件的可訪問性。這樣做會引入競爭條件,因為其他進程可能會在兩次調用之間更改文件的狀態。相反,用戶代碼應該直接打開/讀取/寫入文件並處理文件不可訪問時引發的錯誤。

寫(不推薦)

import { access, open, close } from 'node:fs';

access('myfile', (err) => {
  if (!err) {
    console.error('myfile already exists');
    return;
  }

  open('myfile', 'wx', (err, fd) => {
    if (err) throw err;

    try {
      writeMyData(fd);
    } finally {
      close(fd, (err) => {
        if (err) throw err;
      });
    }
  });
});

寫(推薦)

import { open, close } from 'node:fs';

open('myfile', 'wx', (err, fd) => {
  if (err) {
    if (err.code === 'EEXIST') {
      console.error('myfile already exists');
      return;
    }

    throw err;
  }

  try {
    writeMyData(fd);
  } finally {
    close(fd, (err) => {
      if (err) throw err;
    });
  }
});

閱讀(不推薦)

import { access, open, close } from 'node:fs';
access('myfile', (err) => {
  if (err) {
    if (err.code === 'ENOENT') {
      console.error('myfile does not exist');
      return;
    }

    throw err;
  }

  open('myfile', 'r', (err, fd) => {
    if (err) throw err;

    try {
      readMyData(fd);
    } finally {
      close(fd, (err) => {
        if (err) throw err;
      });
    }
  });
});

閱讀(推薦)

import { open, close } from 'node:fs';

open('myfile', 'r', (err, fd) => {
  if (err) {
    if (err.code === 'ENOENT') {
      console.error('myfile does not exist');
      return;
    }

    throw err;
  }

  try {
    readMyData(fd);
  } finally {
    close(fd, (err) => {
      if (err) throw err;
    });
  }
});

上麵的"not recommended" 示例檢查可訪問性,然後使用該文件; "recommended" 示例更好,因為它們直接使用文件並處理錯誤(如果有)。

通常,僅當文件不會被直接使用時才檢查文件的可訪問性,例如當它的可訪問性是來自另一個進程的信號時。

在 Windows 上,目錄上的access-control 策略 (ACL) 可能會限製對文件或目錄的訪問。但是,fs.access() 函數不會檢查 ACL,因此即使 ACL 限製用戶讀取或寫入路徑,它也可能報告路徑是可訪問的。

相關用法


注:本文由純淨天空篩選整理自nodejs.org大神的英文原創作品 fs.access(path[, mode], callback)。非經特殊聲明,原始代碼版權歸原作者所有,本譯文未經允許或授權,請勿轉載或複製。