fs.existsSync 判断路径是否存在

fs.existsSync(path) 用来判断路径是否存在,如果存在则返回 true,否则返回 false

  1. if (fs.existsSync('/etc/passwd')) {
  2. console.log('该路径已存在');
  3. }

方法存在异步版本 fs.exists(path, callback) 但已经被废弃。 fs.exists() 回调的参数与其他 Node.js 回调不一致, 通常 Node.js 回调的第一个参数是 err 参数,后面可选地跟随其他参数。 fs.exists() 的回调只有一个布尔值参数

  1. fs.exists('/etc/passwd', (isExists) => {
  2. console.log(isExists ? '存在' : '不存在');
  3. });

不建议在在对文件操作前使用 fs.exists() 检查文件是否存在,这样做会引入竞态条件,因为其他进程可能会在两次调用之间更改文件的状态。相反应该直接对文件进行操作,如果文件不存在则处理引发的错误

不推荐使用方式

  1. fs.exists('myfile', (exists) => {
  2. if (exists) {
  3. fs.open('myfile', 'r', (err, fd) => {
  4. if (err) throw err;
  5. readMyData(fd);
  6. });
  7. } else {
  8. console.error('myfile 不存在');
  9. }
  10. });

推荐适用方式

  1. fs.open('myfile', 'r', (err, fd) => {
  2. if (err) {
  3. if (err.code === 'ENOENT') {
  4. console.error('myfile 不存在');
  5. return;
  6. }
  7. throw err;
  8. }
  9. readMyData(fd);
  10. });

虽然 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
  1. const file = './package.json';
  2. // 检查当前目录中是否存在该文件
  3. fs.access(file, fs.constants.F_OK, (err) => {
  4. console.log(`${file} ${err ? '不存在' : '存在'}`);
  5. });
  6. // 检查文件是否可读
  7. fs.access(file, fs.constants.R_OK, (err) => {
  8. console.log(`${file} ${err ? '不可读' : '可读'}`);
  9. });
  10. // 检查文件是否可写
  11. fs.access(file, fs.constants.W_OK, (err) => {
  12. console.log(`${file} ${err ? '不可写' : '可写'}`);
  13. });
  14. // 检查当前目录中是否存在该文件,以及该文件是否可写
  15. fs.access(file, fs.constants.F_OK | fs.constants.W_OK, (err) => {
  16. if (err) {
  17. console.error(
  18. `${file} ${err.code === 'ENOENT' ? '不存在' : '只可读'}`);
  19. } else {
  20. console.log(`${file} 存在,且它是可写的`);
  21. }
  22. });

fs.copyFile 复制文件

fs.copyFile(src, dest[, mode], callback) 将 src 拷贝到 dest, 默认情况下,如果 dest 已经存在则会覆盖,可以通过 mode 参数(文件 copy 常量)修改其行为。
Node.js 不保证拷贝操作的原子性, 如果在打开 dest 文件用于写入后发生错误,则 Node.js 将尝试删除 dest 文件。

  1. const { promises, constants } = require('fs');
  2. const { copyFile } = promises;
  3. // 默认情况下将创建或覆盖目标文件。
  4. copyFile('源文件.txt', '目标文件.txt')
  5. .then(() => console.log('源文件已拷贝到目标文件'))
  6. .catch(() => console.log('该文件无法拷贝'));
  7. // 通过使用 COPYFILE_EXCL,如果目标文件存在,则操作将失败。
  8. copyFile('源文件.txt', '目标文件.txt', constants.COPYFILE_EXCL)
  9. .then(() => console.log('源文件已拷贝到目标文件'))
  10. .catch(() => console.log('该文件无法拷贝'));

fs.rename 文件重命名

fs.rename(oldPath, newPath, callback) 将 oldPath 上的文件重命名为 newPath 提供的路径名,如果 newPath 已存在,则覆盖它

  1. fs.rename('oldPath.txt', 'newPath.txt', (err) => {
  2. if (err) throw err;
  3. console.log('重命名完成');
  4. });

fs.unlink 删除文件

fs.unlink(path, callback) 删除常规文件或软链接,不能用于目录

  1. fs.unlink('path/file.txt', (err) => {
  2. if (err) throw err;
  3. console.log('文件已删除');
  4. });

fs.chmod 修改文件模式

fs.chmod(path, mode, callback)
mode 使用八进制表示 0o765 (0o 表示数字是八进制),和 linux 文件权限规则一致,后三位数字分别代表

  1. 文件 owner 权限
  2. 所在 group 权限
  3. 其它 group 权限
    1. fs.chmod('my_file.txt', 0o775, (err) => {
    2. if (err) throw err;
    3. console.log('文件 my_file.txt 的权限已被更改');
    4. });