nodejs -- fs 模块

fs 全称为 file system ,称之为 文件系统 ,是 Node.js 中的 内置模块 ,可以对计算机中的磁盘进行操作。

nodejs -- fs 模块_第1张图片

本章节会介绍如下几个操作:

        1. 文件写入
        2. 文件读取
        3. 文件移动与重命名
        4. 文件删除
        5. 文件夹操作
        6. 查看资源状态

 文件写入就是将 数据 保存到 文件 中,我们可以使用如下几个方法来实现该效果

nodejs -- fs 模块_第2张图片

1、writeFile 异步写入

语法:fs.writeFile(file, data[, options], callback)

参数说明:
  • file 文件名
  • data 待写入的数据
  • options 选项设置 (可选)
  • callback 写入回调
返回值: undefined
代码示例:
/**
 * 需求:
 * 新建一个文件, 座右铭.txt,  写入内容, 三人行, 则必有我师焉
 */

//1. 导入 fs 模块
const fs = require('fs');

//2. 写入文件
fs.writeFile('./座右铭.txt', '三人行, 则必有我师焉', err => {
  // err 写入失败: 错误对象  写入成功: null
  if(err){
    console.log('写入失败');
    return;
  }
  console.log('写入成功');
});

console.log(1 + 1);

//同步写入
fs.writeFileSync('./data.txt', 'test');

console.log(1 + 1);

2、appendFile追加写入

//1. 引入 fs 模块
const fs = require('fs');

// 2. 调用 appendFile
fs.appendFile('./座右铭.txt', ',择其善者而从之, 择期不善者而改之', err => {
  //判断
  if(err){
    console.log('写入失败~~');
    return;
  }
  console.log('追加写入成功');
});

fs.appendFileSync('./座右铭.txt', '\r\n温故而知新, 可以为师矣')

//writeFile 实现追加写入
fs.writeFile('./座右铭.txt', 'love love love',{flag: 'a'}, err => {
  if(err) {
    console.log('写入失败~');
    return ;
  }
  console.log('写入成功');
});

3、流式写入

/**
 * 观书有感.txt
 */
//1. 导入 fs 
const fs = require('fs');

//2. 创建写入流对象 
const ws = fs.createWriteStream('./观书有感.txt');

//3. write
ws.write('半亩方塘一鉴开\r\n');
ws.write('天光云影共徘徊\r\n');
ws.write('问渠那得清如许\r\n');
ws.write('为有源头活水来\r\n');

//4. 关闭通道
// ws.close();

4、文件读取

//1. 引入 fs 模块
const fs = require('fs');

//2. 异步读取
fs.readFile('./观书有感.txt', (err, data) => {
  if(err) {
    console.log('读取失败~~');
    return;
  }
  console.log(data.toString());
});

//3. 同步读取
let data = fs.readFileSync('./观书有感.txt');

console.log(data.toString());

5、流式读取

//1. 引入 fs 模块
const fs = require('fs');

//2. 创建读取流对象
const rs = fs.createReadStream('../资料/笑看风云.mp4');

//3. 绑定 data 事件   chunk 块儿  大块儿
rs.on('data', chunk => {
  console.log(chunk.length); // 65536 字节 => 64KB
  // console.log(chunk.toString()); // 65536 字节 => 64KB
});

//4. end  可选事件
rs.on('end', () => {
  console.log('读取完成');
});

6、练习-文件复制

/**
 * 需求:
 *   复制『资料』文件夹下的『笑看风云.mp4』
 */
const fs = require('fs');
const process = require('process');

//方式一 readFile
//读取文件内容
// let data = fs.readFileSync('../资料/笑看风云.mp4');
// //写入文件
// fs.writeFileSync('../资料/笑看风云-2.mp4', data);
// console.log(process.memoryUsage()); // rss    110710784 字节   105MB

//方式二 流式操作
//创建读取流对象
const rs = fs.createReadStream('../资料/笑看风云.mp4');
//创建写入流对象
const ws = fs.createWriteStream('../资料/笑看风云-3.mp4');

//绑定 data 事件
// rs.on('data', chunk => {
//   ws.write(chunk);
// });

// rs.on('end', () => {
//   console.log(process.memoryUsage());  // 43106304   =>  41M
// })

rs.pipe(ws);


 7、文件重命名与移动

//1. 导入 fs 模块
const fs = require('fs');

//2. 调用 rename 方法
fs.rename('./座右铭.txt', './论语.txt', err => {
  if(err) {
    console.log('操作失败~');
    return;
  }
  console.log('操作成功');
});

//文件的移动
fs.rename('./data.txt', '../资料/data.txt', err => {
  if(err) {
    console.log('操作失败~');
    return;
  }
  console.log('操作成功');
})

8、删除文件

//1. 导入 fs 模块
const fs = require('fs');

//2. 调用 unlink 方法    unlinkSync
fs.unlink('./观书有感.txt', err => {
  if(err) {
    console.log('删除失败~');
    return;
  }
  console.log('删除成功');
});

// 调用 rm 方法  14.4   rmSync
fs.rm('./论语.txt', err => {
  if (err) {
    console.log('删除失败~');
    return;
  }
  console.log('删除成功');
})

9、文件夹操作

//1. 导入 fs 模块
const fs = require('fs');

//2. 创建文件夹  mk  make 制作  dir directory 文件夹
fs.mkdir('./html', err => {
  if(err) {
    console.log('创建失败~');
    return;
  }
  console.log('创建成功');
});

//2-2 递归创建
fs.mkdir('./a/b/c', {recursive: true},err => {
  if(err) {
    console.log('创建失败~');
    return;
  }
  console.log('创建成功');
});

//2-3 读取文件夹   read 读取  dir  directory 文件夹
fs.readdir('../资料', (err, data) => {
  if(err){
    console.log('读取失败');
    return;
  }
  console.log(data);
});

fs.readdir('./', (err, data) => {
  if(err){
    console.log('读取失败');
    return;
  }
  console.log(data);
});

//2-4 删除文件夹  rm  remove 移除
fs.rmdir('./html', err => {
  if(err){
    console.log('删除失败');
    return;
  }
  console.log('删除成功');
});

//递归删除    不推荐使用
fs.rmdir('./a', {recursive: true},err => {
  if(err){
    console.log(err);
    return;
  }
  console.log('删除成功');
});

//建议使用
fs.rm('./a', {recursive: true},err => {
  if(err){
    console.log(err);
    return;
  }
  console.log('删除成功');
});

 10、查看资源信息

//1. 导入 fs 模块
const fs = require('fs');

//2. stat 方法  status 缩写 状态
fs.stat('../资料/笑看风云.mp4', (err, data) => {
  if(err){
    console.log('操作失败');
    return;
  }
  // console.log(data);
  // isFile 
  console.log(data.isFile());
  // isDirectory
  console.log(data.isDirectory());

});

 11、两种路径

//1. 导入 fs 模块
const fs = require('fs');

//相对路径
// fs.writeFileSync('./index.html', 'love');
// fs.writeFileSync('index.html', 'love');
// fs.writeFileSync('../index.html', 'love');

//绝对路径
// fs.writeFileSync('D:/index.html', 'love');
fs.writeFileSync('/index.html', 'love');

12、相对路径的Bug

会根据终端运行node命令的路径位置不断变化

// 
const fs = require('fs');

// 相对路径参照物: 命令行的工作目录
// fs.writeFileSync('./index.html', 'love');

//绝对路径 '全局变量' 保存的是: 所在文件的所在目录的绝对路径
// console.log(__dirname);
fs.writeFileSync(__dirname + '/index.html', 'love');

你可能感兴趣的:(javascript,node.js,前端)