fs.existsSync 判断路径是否存在
fs.existsSync(path) 用来判断路径是否存在,如果存在则返回 true
,否则返回 false
if (fs.existsSync('/etc/passwd')) {
console.log('该路径已存在');
}
方法存在异步版本 fs.exists(path, callback)
但已经被废弃。 fs.exists() 回调的参数与其他 Node.js 回调不一致, 通常 Node.js 回调的第一个参数是 err 参数,后面可选地跟随其他参数。 fs.exists() 的回调只有一个布尔值参数
fs.exists('/etc/passwd', (isExists) => {
console.log(isExists ? '存在' : '不存在');
});
不建议在在对文件操作前使用 fs.exists() 检查文件是否存在,这样做会引入竞态条件,因为其他进程可能会在两次调用之间更改文件的状态。相反应该直接对文件进行操作,如果文件不存在则处理引发的错误
不推荐使用方式
fs.exists('myfile', (exists) => {
if (exists) {
fs.open('myfile', 'r', (err, fd) => {
if (err) throw err;
readMyData(fd);
});
} else {
console.error('myfile 不存在');
}
});
推荐适用方式
fs.open('myfile', 'r', (err, fd) => {
if (err) {
if (err.code === 'ENOENT') {
console.error('myfile 不存在');
return;
}
throw err;
}
readMyData(fd);
});
虽然 fs.exists() 被废弃,但 fs.existsSync() 没有被废弃,可以正常使用
fs.access 测试用户文件(夹)权限
fs.access(path[, mode], callback)
测试用户对 path 指定的文件或目录的权限。mode 可选值在文件可访问性常量中
mode 常量 | 说明 |
---|---|
F_OK |
方法默认值,表明文件对调用进程可见,可用于判断文件是否存在 |
R_OK |
表明调用进程可以读取文件 |
W_OK |
表明调用进程可以写入文件 |
X_OK |
表明调用进程可以执行文件,在 Windows 上无效(表现等同 fs.constants.F_OK ) |
const file = './package.json';
// 检查当前目录中是否存在该文件
fs.access(file, fs.constants.F_OK, (err) => {
console.log(`${file} ${err ? '不存在' : '存在'}`);
});
// 检查文件是否可读
fs.access(file, fs.constants.R_OK, (err) => {
console.log(`${file} ${err ? '不可读' : '可读'}`);
});
// 检查文件是否可写
fs.access(file, fs.constants.W_OK, (err) => {
console.log(`${file} ${err ? '不可写' : '可写'}`);
});
// 检查当前目录中是否存在该文件,以及该文件是否可写
fs.access(file, fs.constants.F_OK | fs.constants.W_OK, (err) => {
if (err) {
console.error(
`${file} ${err.code === 'ENOENT' ? '不存在' : '只可读'}`);
} else {
console.log(`${file} 存在,且它是可写的`);
}
});
fs.copyFile 复制文件
fs.copyFile(src, dest[, mode], callback)
将 src 拷贝到 dest, 默认情况下,如果 dest 已经存在则会覆盖,可以通过 mode 参数(文件 copy 常量)修改其行为。
Node.js 不保证拷贝操作的原子性, 如果在打开 dest 文件用于写入后发生错误,则 Node.js 将尝试删除 dest 文件。
const { promises, constants } = require('fs');
const { copyFile } = promises;
// 默认情况下将创建或覆盖目标文件。
copyFile('源文件.txt', '目标文件.txt')
.then(() => console.log('源文件已拷贝到目标文件'))
.catch(() => console.log('该文件无法拷贝'));
// 通过使用 COPYFILE_EXCL,如果目标文件存在,则操作将失败。
copyFile('源文件.txt', '目标文件.txt', constants.COPYFILE_EXCL)
.then(() => console.log('源文件已拷贝到目标文件'))
.catch(() => console.log('该文件无法拷贝'));
fs.rename 文件重命名
fs.rename(oldPath, newPath, callback)
将 oldPath 上的文件重命名为 newPath 提供的路径名,如果 newPath 已存在,则覆盖它
fs.rename('oldPath.txt', 'newPath.txt', (err) => {
if (err) throw err;
console.log('重命名完成');
});
fs.unlink 删除文件
fs.unlink(path, callback)
删除常规文件或软链接,不能用于目录
fs.unlink('path/file.txt', (err) => {
if (err) throw err;
console.log('文件已删除');
});
fs.chmod 修改文件模式
fs.chmod(path, mode, callback)
mode 使用八进制表示 0o765
(0o 表示数字是八进制),和 linux 文件权限规则一致,后三位数字分别代表
- 文件 owner 权限
- 所在 group 权限
- 其它 group 权限
fs.chmod('my_file.txt', 0o775, (err) => {
if (err) throw err;
console.log('文件 my_file.txt 的权限已被更改');
});