node.js—fs文件模块

查看文件状态

  • 1.文件模块(fs)

    • 封装了各种文件相关的操作
  • 2.查看文件状态

    • fs.stat(path[, options], callback) ==异步的==
      • 示例:
let fs = require('fs');
// console.log('1');
// fs.stat(__filename,function (err,stats) {  // 当前路径对应的是一个文件
fs.stat(__dirname,function (err,stats) {  // 当前路径对应的是一个文件夹
    if(stats.isFile()){
        console.log("当前路径对应的是一个文件");
    }else if(stats.isDirectory()){
        console.log("当前路径对应的是一个文件夹");
    }
});
// console.log('2');
  • fs.statSync(path[, options]) ==同步的==
    • 输出文件的状态
let fs = require('fs');
let res = fs.statSync(__filename);
console.log(res);  
/* 输出:
Stats {
  dev: 3808154596,
  mode: 33206,
  nlink: 1,
  uid: 0,
  gid: 0,
  rdev: 0,
  blksize: 4096,
  ino: 30399297484798990,
  size: 3364,
  blocks: 8,
  atimeMs: 1589686820442.2046,
  mtimeMs: 1589875993172,
  ctimeMs: 1589875993172,
  birthtimeMs: 1589686820442.2046,
  atime: 2020-05-17T03:40:20.442Z,
  mtime: 2020-05-19T08:13:13.172Z,
  ctime: 2020-05-19T08:13:13.172Z,
  birthtime: 2020-05-17T03:40:20.442Z
}  */
文件读取
  • 1.文件读取
    • fs.readFile(path[, options], callback) ==异步==
    • fs.readFileSync(path[, options]) ==同步==
// data.txt文件
www.it666.com
// js文件
let fs = require("fs");
let path = require("path");

// 1.拿到需要读取的文件路径
let str = path.join(__dirname, "data.txt");
console.log(str);
// 2.读取文件
/*
fs.readFile(str,"utf8", function (err, data) {
    if(err){
        throw new Error("读取文件失败");
    }
    console.log(data);   // www.it666.com
});
 */
let data = fs.readFileSync(str, "utf8");
console.log(data);  // www.it666.com
  • 注意点:
    • 没有指定第二个参数,默认会将读取到的数据放到Buffer中。第二个参数指定为utf8, 返回的数据就是字符串
写入文件
  • 文件写入
    • fs.writeFile(file, data[, options], callback) ==异步==
let fs = require('fs');
let path = require('path');

let res = path.join(__dirname,'ws.txt');
// let buf = Buffer.from('微双');
// fs.writeFile(res,buf,'utf8',function (err) {   这两行是第二种方式,可以用buf代替写入的数据
fs.writeFile(res,'微双','utf8',function (err) {
     if(err){
         throw new Error('写入失败');
     }else{
         console.log('写入成功');    // 写入成功,并且在上面编写的路径下出现了ws.txt文件
     }
 }); 
  • fs.writeFileSync(file, data[, options]) ==同步==
let fs = require('fs');
let path = require('path');

let res = path.join(__dirname,'ws.txt');

let str = fs.writeFileSync(res,'微双','utf8');   // undefined 这里是代表写入成功了
console.log(str);
追加写入
  • 追加写入
    • fs.appendFile(path, data[, options], callback) ==异步==
let fs = require('fs');
let path = require('path');

let res = path.join(__dirname,'ws.txt');
fs.appendFile(res,'加油','utf8',function (err) {
    if(err){
        throw new Error('追加数据失败');
    }else{
        console.log('追加数据成功');    // 追加数据成功
    }
})
  • fs.appendFileSync(path, data[, options]) ==同步==
let fs = require('fs');
let path = require('path');

let res = path.join(__dirname,'ws.txt');
let str = fs.appendFileSync(res,'你是最棒的','utf8');  // undefined 这里是代表追加数据成功了
console.log(str);
大文件操作
  • 大文件操作

    • 前面讲解的关于文件写入和读取操作都是一次性将数据读入内存或者一次性写入到文件中。但是如果数据比较大,直接将所有数据都读到内存中会导致计算机内存爆炸,卡顿,死机等
    • 所以对于比较大的文件我们需要分批读取和写入
  • 读取

    • fs.createReadStream(path[, options])
// 用的上节ws.txt里的内容
let fs = require('fs');
let path = require('path');

// 1.拼接读取的路径
let res = path.join(__dirname,'ws.txt');
// 2.创建一个读取流
let readStream = fs.createReadStream(res, {encoding : "utf8", highWaterMark : 1});
// 3.添加事件监听
readStream.on("open", function () {
    console.log("表示数据流和文件建立关系成功");
});
readStream.on("error", function () {
    console.log("表示数据流和文件建立关系失败");
});
readStream.on("data", function (data) {
    console.log("表示通过读取流从文件中读取到了数据", data);
});
readStream.on("close", function () {
    console.log("表示数据流断开了和文件的关系, 并且数据已经读取完毕了");
});
  • 写入
    • fs.createWriteStream(path[, options])
let fs = require('fs');
let path = require('path');
let res = path.join(__dirname,'wss.txt');

let writeStream = fs.createWriteStream(res,{encoding: 'utf8'});
writeStream.on('open',function () {
    console.log('建立连接成功');
});
writeStream.on('error',function () {
    console.log('建立连接失败');
});
writeStream.on("close", function () {
    console.log("数据流断开了和文件的关系");
});
let data = '今天下午状态还可以';
let index = 0;
timerId = setInterval(function () {
    let ch = data[index];
    writeStream.write(data[index]);
    console.log('这次写入了', data[index]);
    index++;
    if(index === data.length){
        clearInterval(timerId);
        writeStream.end();
    }
},1000);
fs拷贝文件(读取和写入小练习)
  • 需求:把test.mp4拷贝一份(这个不是简化版)
// 1.生成读取和写入的路径
let readPath = path.join(__dirname, "test.mp4");
let writePath = path.join(__dirname, "abc.mp4");
// 2.创建一个读取流
let readStream = fs.createReadStream(readPath);
// 3.创建一个写入流
let writeStream = fs.createWriteStream(writePath);
// 4.监听读取流事件
readStream.on("open", function () {
    console.log("表示数据流和文件建立关系成功");
});
readStream.on("error", function () {
    console.log("表示数据流和文件建立关系失败");
});
readStream.on("data", function (data) {
    // console.log("表示通过读取流从文件中读取到了数据", data);
    writeStream.write(data);  // 读完直接写入
});
readStream.on("close", function () {
    console.log("表示数据流断开了和文件的关系, 并且数据已经读取完毕了");
    writeStream.end();  // 写入完毕后必须手动断开
});
// 5.监听写入流的事件
writeStream.on("open", function () {
    console.log("表示数据流和文件建立关系成功");
});
writeStream.on("error", function () {
    console.log("表示数据流和文件建立关系失败");
});
writeStream.on("close", function () {
    console.log("表示数据流断开了和文件的关系");
});
pipe
  • 利用读取流的管道方法来快速的实现文件拷贝(上面代码的简便写法)
    • 上面的代码中可以读取流.pipe(写入流)
// 1.生成读取和写入的路径
let readPath = path.join(__dirname, "test.mp4");
let writePath = path.join(__dirname, "abc.mp4");
// 2.创建一个读取流
let readStream = fs.createReadStream(readPath);
// 3.创建一个写入流
let writeStream = fs.createWriteStream(writePath);
// 利用读取流的管道方法来快速的实现文件拷贝
readStream.pipe(writeStream);

目录操作

  • 1.创建目录
    • fs.mkdir(path[, mode], callback)异步
    • fs.mkdirSync(path[, mode])同步
let fs = require('fs');
let path = require('path');

let str = path.join(__dirname,'abc');
fs.mkdir(str,function (err) {
    if(err){
        console.log('创建目录失败');
    }else {
        console.log('创建目录成功');
    }
})
  • 2.删除目录
    • fs.rmdir(path, callback)异步
    • fs.rmdirSync(path)同步
// 接上面操作(先创建,后删除)
let fs = require('fs');
let path = require('path');

let str = path.join(__dirname,'abc');
fs.rmdir(str,function (err) {
    if(err){
        console.log('删除目录失败');
    }else {
        console.log('删除目录成功');
    }
})
  • 3.读取目录
    • fs.readdir(path[, options], callback)异步
    • fs.readdirSync(path[, options])同步
let fs = require('fs');
let path = require('path');

let str = path.join(__dirname,'abc');
fs.readdir(__dirname,function (err,files) {
    if(err){
        console.log('读取目录失败');
    }else{
        files.forEach(function (obj) {
            let res = path.join(__dirname,obj);
            let stats = fs.statSync(res);
            if(stats.isFile()){
                console.log('这是一个文件', obj);
            }else if(stats.isDirectory()){
                console.log('这是一个文件夹', obj);
            }
        })
    }
})

文件操作-练习

需求:
利用NodeJS生成项目模板
projectName
|---images
|---css
|---js
|---index.html

let fs = require("fs");
let path = require("path");

class CreateProject {
    constructor(rootPath, projectName){
        this.rootPath = rootPath;
        this.projectName = projectName;
        this.subFiles = ["images", "css", "js", "index.html"];
    }
    initProject(){
        // 1.创建站点文件夹
        let projectPath = path.join(this.rootPath, this.projectName);
        fs.mkdirSync(projectPath);
        // 2.创建子文件和子目录
        this.subFiles.forEach(function (fileName) {
            if(path.extname(fileName) === ""){
                let dirPath = path.join(projectPath, fileName);
                fs.mkdirSync(dirPath);
            }else{
                let filePath = path.join(projectPath, fileName);
                fs.writeFileSync(filePath, "");
            }
        })
    }
}

let cp = new CreateProject(__dirname, "taobao");
cp.initProject();

最后编辑于
©著作权归作者所有,转载或内容合作请联系作者
平台声明:文章内容(如有图片或视频亦包括在内)由作者上传并发布,文章内容仅代表作者本人观点,简书系信息发布平台,仅提供信息存储服务。