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();

最后编辑于
©著作权归作者所有,转载或内容合作请联系作者
  • 序言:七十年代末,一起剥皮案震惊了整个滨河市,随后出现的几起案子,更是在滨河造成了极大的恐慌,老刑警刘岩,带你破解...
    沈念sama阅读 212,383评论 6 493
  • 序言:滨河连续发生了三起死亡事件,死亡现场离奇诡异,居然都是意外死亡,警方通过查阅死者的电脑和手机,发现死者居然都...
    沈念sama阅读 90,522评论 3 385
  • 文/潘晓璐 我一进店门,熙熙楼的掌柜王于贵愁眉苦脸地迎上来,“玉大人,你说我怎么就摊上这事。” “怎么了?”我有些...
    开封第一讲书人阅读 157,852评论 0 348
  • 文/不坏的土叔 我叫张陵,是天一观的道长。 经常有香客问我,道长,这世上最难降的妖魔是什么? 我笑而不...
    开封第一讲书人阅读 56,621评论 1 284
  • 正文 为了忘掉前任,我火速办了婚礼,结果婚礼上,老公的妹妹穿的比我还像新娘。我一直安慰自己,他们只是感情好,可当我...
    茶点故事阅读 65,741评论 6 386
  • 文/花漫 我一把揭开白布。 她就那样静静地躺着,像睡着了一般。 火红的嫁衣衬着肌肤如雪。 梳的纹丝不乱的头发上,一...
    开封第一讲书人阅读 49,929评论 1 290
  • 那天,我揣着相机与录音,去河边找鬼。 笑死,一个胖子当着我的面吹牛,可吹牛的内容都是我干的。 我是一名探鬼主播,决...
    沈念sama阅读 39,076评论 3 410
  • 文/苍兰香墨 我猛地睁开眼,长吁一口气:“原来是场噩梦啊……” “哼!你这毒妇竟也来了?” 一声冷哼从身侧响起,我...
    开封第一讲书人阅读 37,803评论 0 268
  • 序言:老挝万荣一对情侣失踪,失踪者是张志新(化名)和其女友刘颖,没想到半个月后,有当地人在树林里发现了一具尸体,经...
    沈念sama阅读 44,265评论 1 303
  • 正文 独居荒郊野岭守林人离奇死亡,尸身上长有42处带血的脓包…… 初始之章·张勋 以下内容为张勋视角 年9月15日...
    茶点故事阅读 36,582评论 2 327
  • 正文 我和宋清朗相恋三年,在试婚纱的时候发现自己被绿了。 大学时的朋友给我发了我未婚夫和他白月光在一起吃饭的照片。...
    茶点故事阅读 38,716评论 1 341
  • 序言:一个原本活蹦乱跳的男人离奇死亡,死状恐怖,灵堂内的尸体忽然破棺而出,到底是诈尸还是另有隐情,我是刑警宁泽,带...
    沈念sama阅读 34,395评论 4 333
  • 正文 年R本政府宣布,位于F岛的核电站,受9级特大地震影响,放射性物质发生泄漏。R本人自食恶果不足惜,却给世界环境...
    茶点故事阅读 40,039评论 3 316
  • 文/蒙蒙 一、第九天 我趴在偏房一处隐蔽的房顶上张望。 院中可真热闹,春花似锦、人声如沸。这庄子的主人今日做“春日...
    开封第一讲书人阅读 30,798评论 0 21
  • 文/苍兰香墨 我抬头看了看天上的太阳。三九已至,却和暖如春,着一层夹袄步出监牢的瞬间,已是汗流浃背。 一阵脚步声响...
    开封第一讲书人阅读 32,027评论 1 266
  • 我被黑心中介骗来泰国打工, 没想到刚下飞机就差点儿被人妖公主榨干…… 1. 我叫王不留,地道东北人。 一个月前我还...
    沈念sama阅读 46,488评论 2 361
  • 正文 我出身青楼,却偏偏与公主长得像,于是被迫代替她去往敌国和亲。 传闻我的和亲对象是个残疾皇子,可洞房花烛夜当晚...
    茶点故事阅读 43,612评论 2 350