nodejs中fs文件模块使用demo

/**
 * fs.stat  检测是文件还是目录
 * fs.mkdir  创建目录
 * fs.writeFile 创建写入文件
 * fs.appendFile 追加文件
 * fs.readFile 读取文件
 * fs.readdir 读取目录
 * fs.rename 重命名
 * fs.rmdir 删除目录
 * fs.unlink 删除文件
 */

const fs = require('fs');
// 1、fs.stat  检测是文件还是目录

 fs.stat('./html',(err,data) => {
    if(err){
        console.log(err);
    }
    console.log(`是文件:${data.isFile()}`);
    console.log(`是目录:${data.isDirectory()}`);
})



// 2、fs.mkdir 创建目录
/**
 * path       将创建的目录路径
 * mode       目录权限(读写权限) 默认777
 * callback   回调,传递异常参数
 */

fs.mkdir("./css",err => {//在上传文件时  执行这一段,没有这个目录的话就创建,如果有,就会报错
    if(err){
        console.log(err);
        return;
    }
    console.log("创建成功");
})

//3、fs.writeFile 创建写入文件
/**
 * filename  (String)   
 * data      (String|Buffer)
 *options    (Object)          option数组对象包含:
    .encoding  (String)        可选值  默认'utf8'  当data使用buffer时,该值应该为
    .mode    (Number)          文件读写权限,默认值 438
    .flag    (String)          默认值'w'
    .callback{Function}        回调,传递一个异常参数err
 */ 

 fs.writeFile("./html/index.html","你好nodejs",err => {//在html目录创建并写入index.html 写入内容是 你好nodejs  如果文件已经存在则替换此文件
    if(err){
        console.log(err);
        return;
    }
    console.log("创建文件写入成功");
})

//4、fs.appendFile 追加文件

 fs.appendFile("./css/base.css","body{color:red}\n",err => {//在文件内追加内容,而不是替换,如果没有此文件也会创建文件
    if(err){
        console.log(err);
        return;
    }
    console.log("appendFile成功");
})


// 5、fs.readFile 读取文件

 fs.readFile("./html/index.html",(err,data) => {//读取html目录下的index.html文件  读取到的data格式为 buffer类型
    if(err){
        console.log(err);
        return;
    }
    console.log(data);
    console.log(data.toString());//buffer类型转换为字符串
})


// 6、fs.readdir 读取目录

 fs.readdir("./html",(err,data) => {// 读取目录里的文件  目录页可以读取出来
    if(err){
        console.log(err);
        return;
    }
    console.log(data);
})

// 7、fs.rename 重命名   功能  1、重命名  2、移动文件

 fs.rename("./css/aaa.css","./html/cc.css",err => {//将css目录下的aaa.css文件改名为cc.css  如果路径不一样就相当于移动并改名
    if(err){
        console.log(err);
        return;
    }
    console.log("重命名成功");
})

// 8、fs.rmdir 删除目录
fs.rmdir("./html/aaa",err => {//如果目录中有文件则不能删除 会报错
    if(err){
        console.log(err);
        return;
    }
    console.log("删除目录成功");
})
// 9、fs.unlink 删除文件
fs.unlink("./html/aaa/index.html",err => {
    if(err){
        console.log(err);
        return;
    }
    console.log("删除文件成功");
})
// 10、fs.existsSync(path) 同步判断 文件/目录 是否存在
if (fs.existsSync(path)) { do something }

两道小题:

1.判断服务器上有没有upload目录,如果没有创建这个目录,如果有的话不做操作。(图片上传)

const fs = require('fs')
// 1.判断服务器上有没有upload目录,如果没有创建这个目录,如果有的话不做操作。(图片上传)
let path = "./upload"
fs.stat(path,(err,data) => {
    if(err){
        mkdir(path)
        return;
    }
    if(data.isDirectory()){
        console.log("已有upload目录");
    }else{
        // 如果存在upload文件,需要先删除upload文件,再创建upload目录,
        fs.unlink(path,err => {
            if(!err){
                mkdir(path)
            }else{
                console.log("创建失败");
            }
        })
    }
})
// 创建目录
function mkdir(dir){
    fs.mkdir(dir,err => {
        console.log(err);
        if(!err){
            console.log("创建成功");
        }else{
            console.log("创建失败");
        }
        return;
    })
}

2.wwwroot文件夹下面images css js 以及index.html,找出wwwroot目录下面的所有目录,然后把它放在一个数组中。

1、递归实现

let path2 = "./wwwroot",dirArr = [];

// 1、递归实现
fs.readdir(path2,(err,data) =>{
    if(err){
        console.log(err);
        return;
    }
    console.log(data);
    (function getDir(i){
        console.log(i,"i");
        if(i == data.length) {
            console.log(dirArr,"dirArr");
            return;
        }
        fs.stat(path2+"/"+data[i],(error,stats) => {
            if(!error){
                if(stats.isDirectory()){
                    dirArr.push(data[i])
                }
                getDir(i+1);
            }
        })
    })(0);//自执行函数
})

2、async await 实现

// 1、 定义一个isDir方法判断一个资源是目录还是文件
async function isDir(path){
    return new Promise((resolve,reject) => {
        fs.stat(path,(error,stats) => {
            if(error){
                console.log(error);
                reject(error)
                return;
            }
            if(stats.isDirectory()){
                resolve(true)
            }else{
                resolve(false)
            }
        })
    })
}
// 2、获取wwwroot里的所有资源 循环遍历
function main(){
    let path = "./wwwroot"
    fs.readdir(path2,async (err,data) =>{
        if(err){
            console.log(err);
            return;
        }
        for(let i = 0; i < data.length; i++){
            if(await isDir(path + '/' + data[i])){
                dirArr.push(data[i])
            }
        }
        console.log(dirArr);
    })
}

main();

fs模块 读取流、写入流、管道流

读取流:

const fs = require('fs');

var readStream = fs.createReadStream("./data/input.text");

var count = 0;
var str = "";

readStream.on('data',(data)=>{
  str += data;
  count++;
})

readStream.on('end',(data)=>{
  console.log(str,"str");
  console.log(count,"count");
})

readStream.on('error',(err)=>{
  console.log(err,"err");
})

写入流:

const fs = require('fs');
var str = '';

for(let i = 0;i<500;i++){
  str += "我是从数据库获取的数据,我要保存起来\n";
}

var writeStream = fs.createWriteStream("./data/output.text");//会自动生成文件

writeStream.write(str);

// 标记写入完成   标记写入完成,才能监听写入完成事件(如果标记,则不会触发finish事件)
writeStream.end();

// 监听写入完成事件
writeStream.on('finish',()=>{
  console.log("写入完成");
})

管道流:

// 管道流
const fs = require('fs');
var readStream = fs.createReadStream("./data/img/a.jpg");
var writeStream = fs.createWriteStream("./data/b.jpg");

readStream.pipe(writeStream);