当前位置: 首页 > news >正文

nodejs入门教程20:nodejs文件系统

1. 引入fs模块

在Node.js中,你可以通过以下方式引入fs模块:

const fs = require('fs');

2. 文件操作

读取文件
  • 异步读取:使用fs.readFile()方法。该方法接收文件路径和回调函数作为参数,回调函数在文件读取完成后被调用。
fs.readFile('example.txt', 'utf8', (err, data) => {if (err) throw err;console.log(data);
});
  • 同步读取:使用fs.readFileSync()方法。该方法会阻塞程序直到文件读取完成。
try {const data = fs.readFileSync('example.txt', 'utf8');console.log(data);
} catch (err) {console.error('Error reading file:', err);
}
写入文件
  • 异步写入:使用fs.writeFile()方法。该方法接收文件路径、要写入的内容和回调函数作为参数。
const content = 'Hello, World!';
fs.writeFile('example.txt', content, 'utf8', (err) => {if (err) throw err;console.log('File has been written successfully.');
});
  • 同步写入:使用fs.writeFileSync()方法。该方法会阻塞程序直到文件写入完成。
const content = 'Hello, World!';
fs.writeFileSync('example.txt', content, 'utf8');
console.log('File has been written successfully.');
追加内容到文件
  • 异步追加:使用fs.appendFile()方法。如果文件不存在,则会创建文件。
const additionalContent = '\nThis is additional content.';
fs.appendFile('example.txt', additionalContent, 'utf8', (err) => {if (err) throw err;console.log('Content has been appended successfully.');
});
  • 同步追加:使用fs.appendFileSync()方法。
const additionalContent = '\nThis is additional content.';
fs.appendFileSync('example.txt', additionalContent, 'utf8');
console.log('Content has been appended successfully.');

3. 目录操作

创建目录
  • 异步创建:使用fs.mkdir()方法。如果要创建多级目录,可以将recursive选项设置为true
fs.mkdir('new_directory', { recursive: true }, (err) => {if (err) throw err;console.log('Directory created!');
});
  • 同步创建:使用fs.mkdirSync()方法。
fs.mkdirSync('new_directory', { recursive: true });
console.log('Directory created!');
读取目录内容
  • 异步读取:使用fs.readdir()方法。该方法返回目录中的文件和子目录名。
fs.readdir('directory_path', (err, files) => {if (err) throw err;console.log(files);
});
  • 同步读取:使用fs.readdirSync()方法。
try {const files = fs.readdirSync('directory_path');console.log(files);
} catch (err) {console.error('Error reading directory:', err);
}
删除目录
  • 异步删除:使用fs.rmdir()方法。该方法只能删除空目录。要删除非空目录,可以使用fs.rm()方法并将recursive选项设置为true
// 删除空目录
fs.rmdir('empty_directory', (err) => {if (err) throw err;console.log('Directory deleted!');
});// 删除非空目录
fs.rm('non_empty_directory', { recursive: true }, (err) => {if (err) throw err;console.log('Directory and its content deleted!');
});
  • 同步删除:使用fs.rmdirSync()方法(仅适用于空目录)或fs.rmSync()方法(可递归删除非空目录)。
// 删除空目录
fs.rmdirSync('empty_directory');
console.log('Directory deleted!');// 删除非空目录
fs.rmSync('non_empty_directory', { recursive: true });
console.log('Directory and its content deleted!');

4. 文件与目录的信息查询

  • 检查文件或目录是否存在:使用fs.access()方法。该方法不会返回文件或目录的状态,而是根据提供的模式检查文件或目录是否存在。
fs.access('example.txt', fs.constants.F_OK, (err) => {if (err) {console.log('File does not exist!');} else {console.log('File exists!');}
});
  • 获取文件信息:使用fs.stat()方法。该方法返回一个包含文件或目录状态的对象。
fs.stat('example.txt', (err, stats) => {if (err) throw err;console.log(`File size: ${stats.size} bytes`);console.log(`Creation time: ${stats.ctime}`);
});
  • 获取目录内容:如上所述,使用fs.readdir()fs.readdirSync()方法。

5. 流式文件操作

对于大文件或需要逐步处理的文件,使用流式操作更加高效。Node.js提供了四种流:可读流(Readable)、可写流(Writable)、双向流(Duplex)和转换流(Transform)。

// 创建可读流
const readStream = fs.createReadStream('largeFile.txt', 'utf8');// 创建可写流
const writeStream = fs.createWriteStream('largeFileCopy.txt');// 使用管道将可读流连接到可写流
readStream.pipe(writeStream);// 处理流事件
readStream.on('data', (chunk) => {console.log(`Received ${chunk.length} bytes of data.`);
});readStream.on('end', () => {console.log('No more data in readable stream.');
});writeStream.on('finish', () => {console.log('Write completed.');
});

6. 注意事项

  • 异步操作:Node.js的文件系统操作默认是异步的,这有助于保持应用的响应性。在可能的情况下,优先使用异步API。
  • 错误处理:在进行文件系统操作时,务必处理可能发生的错误,以避免应用崩溃。
  • 权限检查:在操作文件或目录之前,确保具有相应的权限。
  • 路径操作:使用path模块来处理文件路径,以避免因路径问题导致的错误。

通过上述教程,你可以掌握Node.js文件系统的基本操作,从而在处理文件和目录时更加得心应手。


http://www.mrgr.cn/news/64245.html

相关文章:

  • Docker-in-Docker(DinD)
  • 零基础学习Java AI Spring AI
  • 【D3.js in Action 3 精译_038】4.2 D3 折线图的绘制方法及曲线插值处理
  • [HCTF 2018]WarmUp 1
  • 《Web性能权威指南》-WebRTC-读书笔记
  • Chromium 中chrome.fontSettings扩展接口定义c++
  • uniapp-vue3比对筛选
  • 软件测试基础三(前端知识)
  • Elastix-基于ITK的医学图像配准库
  • Java中对象的转移(1)——序列化与反序列化
  • 初探Flink的序列化
  • 手撕快排的三种方法:让面试官对你刮目相看
  • 到底要不要用SAP Screen Personas
  • Unity中的屏幕坐标系
  • Matlab车牌识别课程设计报告模板(附源代码)
  • 【OJ题解】C++实现反转字符串中的每个单词
  • Excel函数CUnique连接合并指定区域的唯一值
  • 远程控制时频繁掉线的原因
  • [每周一更]-(第121期):模拟面试|微服务架构面试思路解析
  • 使用 Faster Whisper 和 Gradio 实现实时语音转文字
  • 2024系统架构师---综合题考试真题答案
  • cangjie仓颉程序设计-程序结构(二)
  • 【含文档】基于ssm+jsp的超市订单后台理系统(含源码+数据库+lw)
  • Mac OS 配置Docker+Mysql
  • 2024 Rust现代实用教程 Trait特质
  • Docker:namespace隔离实战