>[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
- 网络开发