0070. 查看符号链接信息
1. 📒 概述
- 要区分普通文件、目录和符号链接,可以使用
fs.lstat()
或fs.lstatSync()
方法。 - 这些方法 不会解析符号链接,而是直接返回符号链接本身的信息。
- 对比:
fs.stat
和fs.lstat
方法 | 是否解析符号链接 | 返回值描述 |
---|---|---|
fs.stat | 是(解析符号链接) | 返回符号链接指向的目标文件或目录的状态信息。 |
fs.lstat | 否(不解析符号链接) | 返回符号链接本身的状态信息,不会解析目标路径。 |
- 🤔 什么叫“解析符号链接”?
- “解析符号链接”:方法会自动跟随符号链接,返回目标文件或目录的状态信息。
- 当操作系统或程序访问一个符号链接时,默认情况下会自动跟随(resolve)这个符号链接,找到它指向的目标文件或目录。这种行为称为“解析符号链接”。
- 假设有一个符号链接
exampleLink.txt
,它指向目标文件example.txt
。 - 如果你使用
fs.stat()
或fs.statSync()
方法检查exampleLink.txt
,Node.js 会自动解析符号链接,并返回目标文件example.txt
的状态信息。 - 换句话说,
fs.stat()
和fs.statSync()
不会告诉你exampleLink.txt
是一个符号链接,而是直接告诉你它指向的目标文件的状态。 - 此时,你可以理解为
exampleLink.txt
就是example.txt
,它们是等价的。
- “不会解析符号链接”:方法不会跟随符号链接,而是直接返回符号链接本身的状态信息。
- 某些方法(如
fs.lstat()
或fs.lstatSync()
)不会自动解析符号链接,而是直接返回符号链接本身的信息。 - 也就是说,它们会告诉你路径是一个符号链接,而不是去检查符号链接指向的目标。
- 假设有一个符号链接
exampleLink.txt
,它指向目标文件example.txt
。 - 如果你使用
fs.lstat()
或fs.lstatSync()
方法检查exampleLink.txt
,Node.js 会返回符号链接本身的状态信息,而不会去解析它指向的目标文件。 - 通过这种方式,你可以区分路径是普通文件、目录还是符号链接。
- 某些方法(如
- “解析符号链接”:方法会自动跟随符号链接,返回目标文件或目录的状态信息。
- 注意:
- 如果传入的链接不存在,会报错
ENOENT
。
- 如果传入的链接不存在,会报错
- 最佳实践:
- 如果你需要知道符号链接指向的目标是什么,可以使用
fs.stat()
或fs.statSync()
。 - 如果你需要判断路径是否是符号链接本身,应该使用
fs.lstat()
或fs.lstatSync()
。
- 如果你需要知道符号链接指向的目标是什么,可以使用
2. 💻 demos.1 - 对比:fs.stat
和 fs.lstat
js
const fs = require('fs')
const path = require('path')
// 定义目标文件和符号链接
const targetPath = path.join(__dirname, '1.txt') // 目标文件
const linkPath = path.join(__dirname, '1_link.txt') // 符号链接
try {
// 创建符号链接
fs.symlinkSync(targetPath, linkPath)
// 使用 fs.statSync 检查符号链接
const statResult = fs.statSync(linkPath)
console.log(`fs.statSync: 是否为文件: ${statResult.isFile()}`) // true
console.log(`fs.statSync: 是否为符号链接: ${statResult.isSymbolicLink()}`) // false(已解析为目标文件)
// 使用 fs.lstatSync 检查符号链接
const lstatResult = fs.lstatSync(linkPath)
console.log(`fs.lstatSync: 是否为文件: ${lstatResult.isFile()}`) // false
console.log(`fs.lstatSync: 是否为符号链接: ${lstatResult.isSymbolicLink()}`) // true(未解析)
} catch (err) {
console.error(`操作失败: ${err.message}`)
}
// 输出:
// fs.statSync: 是否为文件: true
// fs.statSync: 是否为符号链接: false
// fs.lstatSync: 是否为文件: false
// fs.lstatSync: 是否为符号链接: true
// ⚠️
// 如果符号链接 linkPath 已经被创建,则再次创建会报错:
// 操作失败: EEXIST:
// file already exists, symlink
// '/Users/huyouda/zm/notes/TNotes.nodejs/notes/0070. 查看符号链接信息/demos/1/1.txt'
// -> '/Users/huyouda/zm/notes/TNotes.nodejs/notes/0070. 查看符号链接信息/demos/1/1_link.txt'
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
txt
test
1
txt
test
1
fs.statSync
:- 自动解析符号链接,返回目标文件
1.txt
的状态信息。 - 因此,
isFile()
返回true
,isSymbolicLink()
返回false
。
- 自动解析符号链接,返回目标文件
fs.lstatSync
:- 不解析符号链接,返回符号链接本身的状态信息。
- 因此,
isFile()
返回false
,isSymbolicLink()
返回true
。