>[success] # 獲取文件狀態
1. 常用的 api
| API | 描述 |
| --- | --- |
| `fs.stat(path, callback)` | 獲取指定路徑的文件或目錄的詳細信息。 |
| `fs.statSync(path)` | 同步地獲取指定路徑的文件或目錄的詳細信息。 |
| `fs.existsSync(path)` | 同步地判斷指定路徑的文件或目錄是否存在。 |
| `fs.access(path, mode, callback)` | 測試指定路徑的文件或目錄是否可訪問。 |
| `fs.accessSync(path, mode)` | 同步地測試指定路徑的文件或目錄是否可訪問。 |
| `fs.fstat(fd, callback)` | 獲取一個已經打開的文件的詳細信息。 |
| `fs.lstat(path, callback)` | 獲取指定路徑的文件或目錄的詳細信息,包括符號鏈接本身的信息。 |
| `fs.fstatSync(fd, [, options])` | 同步獲取一個已經打開的文件的詳細信息。 |
| `fs.lstatSync(path, [, options])` | 同步獲取指定路徑的文件或目錄的詳細信息,包括符號鏈接本身的信息。 |
2. 想獲取文件文件屬性信息例如`是否是一個普通文件`,`是否是文件是一個目錄`等,就可以通過其 **返回值(fs.Stats 類)** 進行判斷
| 屬性 | 類型 | 描述 |
| --- | --- | --- |
| `stats.isFile()` | `function` | 如果文件是一個普通文件,則返回`true`,否則返回`false`。 |
| `stats.isDirectory()` | `function` | 如果文件是一個目錄,則返回`true`,否則返回`false`。 |
| `stats.isBlockDevice()` | `function` | 如果文件是一個塊設備,則返回`true`,否則返回`false`。 |
| `stats.isCharacterDevice()` | `function` | 如果文件是一個字符設備,則返回`true`,否則返回`false`。 |
| `stats.isSymbolicLink()` | `function` | 如果文件是一個符號鏈接,則返回`true`,否則返回`false`。 |
| `stats.isFIFO()` | `function` | 如果文件是一個 FIFO,則返回`true`,否則返回`false`。 |
| `stats.isSocket()` | `function` | 如果文件是一個 Socket,則返回`true`,否則返回`false`。 |
| `stats.dev` | `number` | 文件所在設備的 ID。 |
| `stats.ino` | `number` | 文件的 inode 編號。 |
| `stats.mode` | `number` | 文件的權限模式。 |
| `stats.nlink` | `number` | 文件的硬鏈接數。 |
| `stats.uid` | `number` | 文件所有者的用戶 ID。 |
| `stats.gid` | `number` | 文件所有者的組 ID。 |
| `stats.rdev` | `number` | 如果文件是一個特殊文件,則為其設備 ID。 |
| `stats.size` | `number` | 文件大小(以字節為單位)。 |
| `stats.blksize` | `number` | 文件系統塊的大小。 |
| `stats.blocks` | `number` | 已分配給文件的塊數。 |
| `stats.atimeMs` | `number` | 文件的最后訪問時間(以毫秒為單位)。 |
| `stats.mtimeMs` | `number` | 文件的最后修改時間(以毫秒為單位)。 |
| `stats.ctimeMs` | `number` | 文件的最后更改時間(以毫秒為單位)。 |
| `stats.birthtimeMs` | `number` | 文件的創建時間(以毫秒為單位)。 |
| `stats.atime` | `Date` | 文件的最后訪問時間(以`Date`對象形式)。 |
| `stats.mtime` | `Date` | 文件的最后修改時間(以`Date`對象形式)。 |
| `stats.ctime` | `Date` | 文件的最后更改時間(以`Date`對象形式)。 |
| `stats.birthtime` | `Date` | 文件的創建時間(以`Date`對象形式)。 |
>[danger] ### fs.stat(path\[, options\], callback)
`s.stat()`是Node.js文件系統模塊中的一個方法,用于獲取指定路徑的文件或目錄的詳細信息,例如文件大小、修改時間、創建時間等。
函數簽名如下:
~~~
fs.stat(path[, options], callback)
~~~
參數說明如下:
* `path`:需要獲取信息的文件或目錄的路徑。
* `options`:一個可選的對象,用于指定一些選項,例如`bigint`選項,用于返回大整數值而非默認的數字類型。
* `callback`:一個回調函數,用于處理`fs.stat()`方法返回的結果。該回調函數接收兩個參數,第一個參數為錯誤對象,如果沒有錯誤則為`null`,第二個參數為表示文件或目錄信息的`fs.Stats`對象。
2. `fs.stat()`方法可以用于判斷文件或目錄是否存在,如果指定的文件或目錄不存在,則會返回一個`ENOENT`錯誤,可以通過判斷錯誤碼來判斷文件或目錄是否存在。如果存在,則會返回`fs.Stats`對象,可以通過該對象的屬性來獲取文件或目錄的詳細信息。
~~~
const fs = require('fs');
fs.stat('/path/to/file', (err, stats) => {
if (err) {
if (err.code === 'ENOENT') {
console.log('File not found');
} else {
console.error(err);
}
} else {
console.log(stats);
}
});
~~~
>[danger] ##### 案例
~~~
const fs = require('fs')
// 獲取文件類型
fs.stat('./test.js', (err, stats) => {
if (err) {
console.log(err)
} else {
console.log(stats.isFile()) // true
console.log(stats.isDirectory()) // false
console.log(stats) // false
}
})
~~~
* 打印結果
~~~
Stats {
dev: 1320529684,
mode: 33206,
nlink: 1,
uid: 0,
gid: 0,
rdev: 0,
blksize: 4096,
ino: 281474977770454,
size: 258,
blocks: 8,
atimeMs: 1681265118474.2537,
mtimeMs: 1681265113121.3955,
ctimeMs: 1681265113121.3955,
birthtimeMs: 1679989091154.562,
atime: 2023-04-12T02:05:18.474Z,
mtime: 2023-04-12T02:05:13.121Z,
ctime: 2023-04-12T02:05:13.121Z,
birthtime: 2023-03-28T07:38:11.155Z
}
~~~
>[danger] ### fs.statSync(path\[, options\])
1. 在使用`fs.statSync()`方法時,需要傳入文件或目錄的路徑作為第一個參數`path`。如果需要指定可選項,則可以傳入一個包含`bigint`和`throwIfNoEntry`字段的可選項對象作為第二個參數`options`。`options.bigint`字段用于指定返回的`fs.Stats`對象中的數值是否應為`bigint`,默認值為`false`,即返回普通數字。`options.throwIfNoEntry`字段用于指定如果文件系統條目不存在,方法是否會拋出異常,而不是返回`undefined`,默認值為`true`。
| 參數名 | 類型 | 描述 | 默認值 |
| --- | --- | --- | --- |
| `path` | string | Buffer | URL | 文件或目錄的路徑。 | 無 |
| `options` | Object | 可選項對象,包含以下字段: | `{ bigint: false, throwIfNoEntry: true }` |
| `options.bigint` | boolean | 返回的`fs.Stats`對象中的數值是否應為`bigint`。 | `false` |
| `options.throwIfNoEntry` | boolean | 如果文件系統條目不存在,是否會拋出異常,而不是返回`undefined`。 | `true` |
>[danger] ##### 案例
~~~
const fs = require('fs');
try {
const stats = fs.statSync('/path/to/file');
console.log(stats.isFile()) // true
console.log(stats.isDirectory()) // false
console.log(stats);
} catch (err) {
console.error(err);
}
~~~
>[danger] ### fs.existsSync(path) 路徑的文件或目錄是否存在
1. `fs.existsSync(path)`是 Node.js 中的一個同步方法,用于檢查指定的文件或目錄是否存在。它接受一個文件或目錄的路徑作為參數,如果該路徑表示的文件或目錄存在,則返回 true,否則返回 false。
2. 這是一個同步方法,會阻塞代碼的執行,因此在進行文件或目錄檢查的時候,建議使用異步方法,如`fs.stat()`
>[danger] ##### 案例
~~~javascript
const fs = require('fs');
// 檢查文件是否存在
const fileExists = fs.existsSync('/path/to/file.txt');
console.log(fileExists); // true 或 false
// 檢查目錄是否存在
const dirExists = fs.existsSync('/path/to/dir');
console.log(dirExists); // true 或 false
~~~
>[danger] ### fs.fstat(fd[, options], callback)
1. `fs.fstat(fd[, options], callback)`是 Node.js 中用于獲取文件描述符所指向的文件的元數據的方法。它是一個異步方法,可以用于獲取文件的大小、創建時間、修改時間等信息。
>[danger] ##### api 介紹
`fs.fstat()`方法接受三個參數:
* `fd`:文件描述符,由`fs.open()`或`fs.openSync()`方法返回。
* `options`:一個可選的對象,用于指定一些選項。目前支持的選項包括`bigint`,如果設置為`true`,則返回的文件大小將以`BigInt`類型表示,否則將以普通的`Number`類型表示。默認值為`false`。
* `callback`:一個回調函數,用于處理獲取到的元數據。回調函數接受兩個參數,第一個參數是可能發生的錯誤,第二個參數是包含文件元數據的`fs.Stats`對象。
>[danger] ##### 案例
~~~
const fs = require('fs');
// 打開文件并獲取文件描述符
fs.open('/path/to/file.txt', 'r', (err, fd) => {
if (err) throw err;
// 獲取文件元數據
fs.fstat(fd, (err, stats) => {
if (err) throw err;
// 打印文件大小和修改時間
console.log(`文件大小:${stats.size} 字節`);
console.log(`修改時間:${stats.mtime}`);
// 關閉文件描述符
fs.close(fd, (err) => {
if (err) throw err;
});
});
});
~~~
- 基礎
- 什么是Node.js
- 理解 I/O 模型
- 理解node 中 I/O
- 對比node 和java 使用場景
- node 模塊管理
- 內置模塊 -- buffer
- 內置模塊 -- fs
- fs -- 文件描述符
- fs -- 打開文件 api
- fs -- 文件讀取 api
- fs -- 文件寫入 api
- fs -- 創建目錄 api
- fs -- 讀取文件目錄結構 api
- fs -- 文件狀態(信息) api
- fs -- 刪除文件/目錄 api
- fs -- 重命名 api
- fs -- 復制文件 api
- 內置模塊 -- events
- 內置模塊 -- stream
- 可讀流 -- Readable
- 可寫流 -- Writable
- Duplex
- Transform
- 內置模塊 -- http
- http -- 從客戶端發起
- http -- 從服務端發起
- 內置模塊 -- url
- 網絡開發