您现在的位置是:网站首页 > fs模块的核心API文章详情

fs模块的核心API

fs模块的核心API

Node.js的fs模块提供了丰富的文件系统操作功能,涵盖了从基础文件读写到高级流式处理的各个方面。这个模块同时提供了同步和异步的API,支持Promise形式的调用,能够满足不同场景下的开发需求。

文件读取

fs.readFile()是最常用的文件读取方法,它提供了异步读取文件的简单方式:

const fs = require('fs');

// 异步读取文件
fs.readFile('example.txt', 'utf8', (err, data) => {
  if (err) throw err;
  console.log(data);
});

// Promise版本
const fsPromises = require('fs').promises;
async function readFileExample() {
  try {
    const data = await fsPromises.readFile('example.txt', 'utf8');
    console.log(data);
  } catch (err) {
    console.error(err);
  }
}

同步版本fs.readFileSync()适用于脚本或初始化阶段:

try {
  const data = fs.readFileSync('example.txt', 'utf8');
  console.log(data);
} catch (err) {
  console.error(err);
}

文件写入

fs.writeFile()提供了文件写入功能,会覆盖已有文件内容:

const content = 'Hello, Node.js!';

// 异步写入
fs.writeFile('message.txt', content, (err) => {
  if (err) throw err;
  console.log('文件已保存');
});

// 追加写入
fs.appendFile('message.txt', '\n追加内容', (err) => {
  if (err) throw err;
  console.log('内容已追加');
});

文件状态与元数据

fs.stat()方法可以获取文件或目录的详细信息:

fs.stat('example.txt', (err, stats) => {
  if (err) throw err;
  
  console.log(`文件大小: ${stats.size} bytes`);
  console.log(`创建时间: ${stats.birthtime}`);
  console.log(`是否是文件: ${stats.isFile()}`);
  console.log(`是否是目录: ${stats.isDirectory()}`);
});

目录操作

创建、读取和删除目录的操作:

// 创建目录
fs.mkdir('new-directory', { recursive: true }, (err) => {
  if (err) throw err;
});

// 读取目录内容
fs.readdir('./', (err, files) => {
  if (err) throw err;
  files.forEach(file => {
    console.log(file);
  });
});

// 删除目录
fs.rmdir('empty-directory', (err) => {
  if (err) throw err;
});

文件流操作

对于大文件,使用流可以提高性能:

// 创建可读流
const readStream = fs.createReadStream('large-file.txt', 'utf8');

readStream.on('data', (chunk) => {
  console.log(`接收到 ${chunk.length} 字节的数据`);
});

readStream.on('end', () => {
  console.log('文件读取完成');
});

// 创建可写流
const writeStream = fs.createWriteStream('output.txt');
writeStream.write('一些数据...\n');
writeStream.write('更多数据...\n');
writeStream.end('写入完成');

文件监视

fs.watch()可以监视文件或目录的变化:

const watcher = fs.watch('example.txt', (eventType, filename) => {
  console.log(`事件类型: ${eventType}`);
  if (filename) {
    console.log(`文件名: ${filename}`);
  }
});

// 停止监视
setTimeout(() => {
  watcher.close();
}, 10000);

文件权限与模式

修改文件权限和所有权:

// 更改文件权限
fs.chmod('script.sh', 0o755, (err) => {
  if (err) throw err;
});

// 更改文件所有者
fs.chown('file.txt', 1000, 1000, (err) => {
  if (err) throw err;
});

符号链接操作

处理符号链接的相关方法:

// 创建符号链接
fs.symlink('target.txt', 'link.txt', (err) => {
  if (err) throw err;
});

// 读取符号链接指向的实际路径
fs.readlink('link.txt', (err, linkString) => {
  if (err) throw err;
  console.log(linkString);
});

文件系统高级操作

fs模块还提供了一些高级功能:

// 截断文件
fs.truncate('large-file.txt', 100, (err) => {
  if (err) throw err;
});

// 文件重命名
fs.rename('old-name.txt', 'new-name.txt', (err) => {
  if (err) throw err;
});

// 复制文件
const { copyFile } = require('fs').promises;
copyFile('source.txt', 'destination.txt')
  .then(() => console.log('文件复制成功'))
  .catch(console.error);

错误处理最佳实践

处理文件系统操作时的错误非常重要:

fs.readFile('nonexistent.txt', 'utf8', (err, data) => {
  if (err) {
    if (err.code === 'ENOENT') {
      console.error('文件不存在');
    } else {
      console.error('发生错误:', err.message);
    }
    return;
  }
  console.log(data);
});

我的名片

网名:~川~

岗位:console.log 调试员

坐标:重庆市-九龙坡区

邮箱:cc@qdcc.cn

沙漏人生

站点信息

  • 建站时间:2013/03/16
  • 本站运行
  • 文章数量
  • 总访问量
微信公众号
每次关注
都是向财富自由迈进的一步