Node.js学习——常用fs模块

    1. fs.stat 检测是文件还是目录
    1. fs.mkdir 创建目录
    1. fs.writeFile 创建写入文件
    1. fs.appendFile 追加文件
    1. fs.readFile 异步读取文件,(fs.readFileSync 同步读取文件)
    1. fs.readdir 读取目录
    1. fs.rename 重命名
    1. fs.rmdir 删除目录
    1. fs.unlink 异步删除文件,(fs.unlinkSync同步删除文件)

fs提供读写方法,对应参数:

  • path:要打开的文件路径活文件描述
  • file:协议的URL对象作为fs操作的路径
  • flags:文件打开的模式
  • mode:设置文件权限
flags的选项字符串及其含义
  • 'a':打开文件用于追加。如果文件不存在,则创建该文件。
  • 'a+':打开文件用于读取和追加。如果文件不存在,则创建该文件。
  • 'as+'打开文件用于读取和追加(在同步模式中)。如果文件不存在,则创建该文件。
  • 'r':打开文件用于读取。如果文件不存在,则会发生异常。
  • 'rs+':打开文件用于读取和写入(在同步模式中)。指示操作系统绕过本地的文件系统缓存。
  • 'w+':打开文件用于读取和写入。如果文件不存在则创建文件,如果文件存在则截断文件。

同步打开文件并写入内容

const fs = require('fs');
const fd = fs.openSync('./test.txt', 'rs+');

fs.write(fd, 'How are you?', (err, written, str) => { // 向fd所指向的文件添加内容
    if (err) throw err; // 如果写入失败将抛出错误
    console.log(written); // 返回写入的字符串的所占字节数(注意:1个汉字占3个字节)
    console.log(str); // 返回写入的文件内容
})

异步打开文件并写入内容

const fs = require('fs');       // 操作文件必须引入fs文件模块(包)
fs.open('./test.txt', 'rs+', (err, fd) => { // 以异步方式打开文件,fd为文件指针,指向所打开的文件
    if (err) {
        console.log('文件打开失败!');
        return false;
    }
/*
    fs.write(fd,string[,position[,encoding]], callback)  一般不用    
    用于将 string 写入到 fd 指定的文件
    --fd 文件路径或文件描述符,必选;
    --string 要写入的字符串内容,也可以是一个buffer
    --position 数据要被写入的位置;
    --encoding 是期望的字符串编码,默认值: utf8;
    --callback 回调会接收到参数(err, written, string)
    written 指定传入的字符串中写入的字节数。
    被写入的字节数不一定与被写入的字符串字符数相同
*/   
    fs.write(fd, 'How are you?', (err, written, str) => { // 向fd所指向的文件添加内容
        if (err) throw err;     // 如果写入失败将抛出错误
        console.log(written);       // 返回写入的字符串的所占字节数(注意:1个汉字占3个字节)
        console.log(str);       // 返回写入的文件内容
    })
})

fs.closeSync(fd)同步关闭文件
fs.close(fd,callback)异步关闭文件,异步关闭存在回调函数,内部只有1异常参数err

const fs = require('fs');

fs.open('./test.txt', 'rs+', (err, fd) => {
    if (err) {
        console.log('文件打开失败!');
        return false;
    }
    fs.close(fd, err => {
        if (err) throw err;
        // 关闭文件的回调函数体
    })
})
const fs = require('fs')
// data.isFile() 判断是否为文件
// data.isDirectory()判断是否为目录
/*
    fs.stat('./html', (err, data) => {
        if (err) {
            console.log(err);
            return;
        }
        console.log(`是文件:${data.isFile()}`);
        console.log(`是目录:${data.isDirectory()}`);
    })
*/

/*
fs.mkdir()传递的三个参数
path 将创建的目录路径
mode 目录权限(读写权限),默认777
callback 回调,传递异常参数err
*/
/*
fs.mkdir('./css', (err, data) => {
    if (err) {
        console.log(err);
        return;
    }
    console.log('创建成功');
})
*/

/*
// 写入文件时,如果文件存在就直接覆盖,如果文件不存在就直接创建并写入
    /*
        filename      (String)            文件名称
        data        (String | Buffer)    将要写入的内容,可以使字符串 或 buffer数据。
        options        (Object)           option数组对象,包含:
        · encoding   (string)            可选值,默认 ‘utf8′,当data使buffer时,该值应该为 ignored。
        · mode         (Number)        文件读写权限,默认值 438
        · flag            (String)            默认值 ‘w'
        callback {Function}  回调,传递一个异常参数err。
    */
fs.writeFile('./html/index.html', '你好Node.js', (err, data) => {
    if (err) {
        console.log(err);
        return;
    }
    console.log('创建写入文件成功');
})
*/

// 追加文件时,如果文件存在就直接在文件后追加内容,如果文件不存在就直接创建并写入
/*
fs.appendFile('./css/style.css', 'h1{color:red}\n', (err) => {

    if (err) {
        console.log(err);
        return;
    }
    console.log('appendFile成功');
})
*/
// 同步读取文件
/*
let orders = fs.readFileSync('./html/index.html', 'utf-8');
console.log(orders);
*/

/*
fs.readFile(path[, options], callback)
options:
  --encoding:编码方式,默认值: null;
  --flag:文件系统flag 的支持。默认值为‘r‘
callback:说明异步读取文件的回调函数,传入两个参数(err, data)
    err:异常出错信息;
    data:读取文件内容,若未指定字符编码,返回原始buffer
 */
/*
fs.readFile('./html/index.html', 'utf-8', (err, data) => {
    if (err) {
        console.log(err);
        return;
    }
    console.log(data);
    console.log(data.toString()); // 将Buffer转换为string类型  ,不加utf-8就需要加这一句
})
*/
/*
fs.readdir('./html', (err, data) => {
    if (err) {
        console.log(err);
        return
    }
    console.log(data);
})
*/
// 重命名或移动的功能
// 重命名
// fs.rename('./html/a.html', './html/b.html', (err, data) => {
//     if (err) {
//         console.log(err);
//         return
//     }
//     console.log(data);
// })
// 移动
/*
fs.rename('./html/b.html', './css/b.css', (err, data) => {
    if (err) {
        console.log(err);
        return
    }
    console.log('移动文件成功');
})
*/
// 删除目录,如果不加第二个参数{recursive: true }只能删除空目录而不能删除有文件的目录
/*
fs.rmdir('./aaa', { recursive: true }, (err, data) => {
    if (err) {
        console.log(err);
        return
    }
    console.log('删除目录成功');
})
*/
// 删除文件
fs.unlink('./css/b.css', (err, data) => {
    if (err) {
        console.log(err);
        return
    }
    console.log('删除文件成功');
})

操作

检查upload目录是否存在,不存在就创建一个

const fs = require('fs')
let path = './upload'

fs.stat(path, (err, data) => {
    if (err) {
        console.log(err);
        mkdir(path)
        return
    }
    if (!data.isDirectory) {
        fs.unlink(path, (err, data) => {
            if (!err) {
                mkdir(path)
            } else {
                console.log('检查文件格式是否正确');
            }

        })
    } else {
        console.log('目录已经存在');
    }
})

function mkdir(dir) {
    fs.mkdir(dir, (err, data) => {
        if (err) {
            console.log(err);
            return
        }
    })
}

对于文件的操作还可以使用三方库mkdirp https://www.npmjs.com/package/mkdirp

var mkdirp = require('mkdirp');

mkdirp('./upload/aaa/xxxx', function (err) {
    if (err) {
        console.error(err);
    }
});

在一个目录中找出所有的目录,并将目录的名称放入一个数组中
注意:fs里面的方法是异步
方法一,使用闭包的方式:

const fs = require('fs');
let path = '../wwwroot';
let dirArr = [];
fs.readdir(path,(err,data)=>{
    if(err){
        console.log(err);
        return;
    }
    (function yy(i){
        if(i === data.length){
            console.log(dirArr);
            return;
        }
        let pathName = path + '/' + data[i];
        fs.stat(pathName,(err,ret)=>{
            if(ret.isDirectory()){
                dirArr.push(data[i])
            }
            yy(i+1)
        })
    })(0)
})

方法二:使用async和await

const fs = require('fs');
function isDirec(pathName){
    return new Promise((resolve,reject)=>{
        fs.stat(pathName,(err,ret)=>{
            if(err){
                console.log(err);
                reject(err);
                return;
            }
            if(ret.isDirectory()){
                resolve(true)
            }else{
                resolve(false)
            }
        })
    })
}

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

推荐阅读更多精彩内容

  • 通过一个简单的 node 命令行的 todo 项目学习了 nodejs 文件模块,收获颇多。 Github 源码[...
    Yandhi233阅读 320评论 0 3
  • 1、Node.js的初步 (1)下载node.js:https://nodejs.org/zh-cn/ (2)配置...
    Z_Hao_f3f1阅读 172评论 0 0
  • 1.Node.js概述 基于谷歌的V8引擎,运行在服务器端的JS解释器。官网:www.nodejs.org[htt...
    栗子树下_阅读 356评论 0 0
  • node中的模块: commonJs 模块是Node.js 应用程序的基本组成部分,文件和模块是一一对应的。换言之...
    淡退阅读 394评论 0 0
  • nodejs res.end()一定要写,否则浏览器将会进入无限加载的假死状态。 即使已经写了charset='u...
    Lnevan阅读 1,723评论 0 3