美文网首页
Nodejs 中 fs 模块的使用

Nodejs 中 fs 模块的使用

作者: shadow123 | 来源:发表于2020-11-27 16:28 被阅读0次

    fsfilesystem的缩写,该模块提供本地文件的读写能力,基本上是POSIX文件操作命令的简单包装。

    导入文件系统模块(fs)语法如下所示:

    var fs = require("fs")
    

    fs.stat 检测是文件还是目录

    stat方法的参数是一个文件或目录,它产生一个对象,该对象包含了该文件或目录的具体信息。

    fs.stat("./data/demo.js",function(err,stats){
        if(err){
            console.log(err)
            return
        }
        if(stats.isFile()){
            // 文件
        }else if(stats.isDirectory()){
            // 目录
        }
    })
    

    fs.mkdir 创建目录

    mkdir 方法用于新建目录

    fs.mkdir('./demo',function(err){
        if(err){
            console.log(err)
            return 
        }
        console.log("创建成功!")
    })
    

    mkdirSync 是创建目录的同步方法

    fs.mkdirSync('./demo')
    

    fs.writeFile 创建写入文件

    writeFile 直接打开文件默认是 w 模式,所以如果文件存在,该方法写入的内容会覆盖旧的文件内容。

    fs.writeFile('input.txt', 'hello world!', function(err){
        if(err) {
            console.log(err)
            return 
        }
        console.log("写入文件成功")
    })
    

    writeFileSync 写入文件的同步方法

    fs.writeFileSync('input.txt','hello World!')
    

    fs.readFile 读取文件

    readFile 方法读取的是 Buffer,使用toString 方法转成 String类型

    fs.readFile('input.txt', function(err,data){
        if(err) {
            console.log(err)
            return 
        }
        console.log(data.toString())
    })
    

    readFileSync 是读取文件的同步方法

    const data = fs.readFileSync('input.txt')
    console.log(data.toString())
    

    fs.appendFile 追加文件

    异步地追加数据到文件,如果文件尚不存在则创建文件。 data 可以是字符串或 Buffer。

    fs.appendFile('./input.txt','追加的内容',function(err,data){
        if(err){
            console.log(err)
            return 
        }
        console.log('追加成功!')
    })
    

    appendFileSync 是追加文件 的同步方法

    try {
      fs.appendFileSync('./input.txt','追加的内容')
      console.log('追加成功');
    } catch (err) {
      console.log(err)
    }
    

    fs.readdir 读取目录

    readdir 方法用于读取目录,返回一个所包含的所有文件和子目录的数组。

    fs.readdir('./data', function (err, files) {
        if (err) {
            console.log(err)
            return 
        }
        console.log(files)
    })
    

    readdirSync 是读取文件的同步方法

    try {
      const files = fs.readdirSync('./data')
      console.log(files);
    } catch (err) {
      console.log(err)
    }
    

    fs.rename 重命名

    rename 方法用于文件的重命名或移动。

    重命名文件

    fs.rename('input.txt', 'new.txt', (err) => {
      if (err) throw err;
      console.log('重命名成功');
    });
    

    移动文件

    fs.rename('input.txt', './data/input.txt', (err) => {
      if (err) throw err;
      console.log('移动文件完成');
    });
    

    renameSync 是 rename 同步版本

    // 重命名
    try {
      fs.renameSync('input.txt', 'new.txt')
      console.log("重命名成功");
    } catch (err) {
      console.log(err)
    }
    // 移动
    try {
      fs.renameSync('input.txt', './data/input.txt')
      console.log("重命名成功");
    } catch (err) {
      console.log(err)
    }
    

    fs.rmdir 删除目录

    rmdir 方法用于删除目录,只能删除空目录。

    fs.rmdir('./demo', function (err) {
        if (err) {
            console.log(err)
            return 
        }
        console.log('删除目录成功')
    })
    

    rmdirSync 是删除目录的同步方法。

    try{
        fs.rmdirSync('./demo')
        console.log("删除目录成功")
    }catch(err){
        console.log(err)
    }
    

    fs.unlink 删除文件

    unlink 方法用于删除文件

    fs.unlink('input.txt',(err)=>{
        if(err){
            console.log(err)
            return 
        }
        console.log('删除文件成功')
    })
    

    unlinkSync 是删除文件的同步方法

    try{
        fs.rmdirSync('./demo')
        console.log("删除目录成功")
    }catch(err){
        console.log(err)
    }
    

    fs.createReadStream

    createReadStream 方法用于从文件流读取数据,一般用于大型文本文件。
    读取操作会触发data事件,发送完成会触发end事件。

    const readSteam = fs.createReadStream('./input.txt')
    
    var count = 0
    var str = ""
    
    readSteam.on('data', (data) => {
        str += data
        count++ 
    })
    
    readSteam.on('end', () => {
        console.log(str)
        console.log(count)
    })
    
    readSteam.on('error', (err) => {
        console.log(err)
    })
    

    fs.createWriteStream

    createWriteStream方法创建一个写入数据流对象,该对象的write方法用于写入数据,end方法用于结束写入操作。

    var str = ""
    for(var i=0;i<500;i++){
        str +="写入的数据\n"
    }
    var writeStream = fs.createWriteStream('./input.txt');
    writeStream.write(str);
    writeStream.end();
    
    writeStream.on('finish',()=>{
        console.log('写入完成')
    })
    

    pipe 管道流

    管道提供了一个输出流到输入流的机制。通常我们用于从一个流中获取数据并将数据传递到另外一个流中。

    var readStream = fs.createReadStream('input.txt')
    var writeStream = fs.createWriteStream('out.txt')
    
    readStream.pipe(writeStream)
    

    练习

    1.判断服务器上没有upload 文件,如果没有就创建目录。

    如果有upload文件,需要先删除upload 文件才能创建upload文件夹。实现如下:

    const fs = require('fs')
    const path = "./upload"
    function mkdir(path){
        fs.mkdir(path,(err)=>{
                if(err){
                    console.log(err)
                    return 
                }
                console.log('创建成功')
            })
    }
    fs.stat(path,(err,stats)=>{
        if(err){
            mkdir(path)
            return 
        }
        if(!stats.isDirectory()){
            fs.unlink('./upload',(error)=>{
                if(error){
                    console.log(error)
                    return
                }
                mkdir(path)
            })
        }
    })
    

    2.public 文件夹下有images、js、css文件夹和index.html 文件,找出public下所有的目录,放到数组中 。

    const fs = require('fs')
    const path = "./public"
    var arr= []
    fs.readdir(path, (err, files) => {
        if (err) {
            console.log(err)
            return 
        }
        (function getDir(i) {
            if (i == files.length) {
                console.log(arr)
                return 
            }
            fs.stat(path + '/' + files[i], (err,stats) => {
                if (stats.isDirectory()) {
                    arr.push(files[i])
                }
                getDir(i+1)
            })
        })(0)
    })
    

    async/await 实现如下:

    function isDir(file) {
        return new Promise((resolve, reject) => {
            fs.stat(file, (err, stats) => {
                if (err) {
                    console.log(err)
                    reject()
                    return
                }
                if (stats.isDirectory()) {
                    resolve(true)
                } else{
                    resolve(false)
                }
            })
        })
    }
    function readDir() {
        return new Promise((resolve, reject) => {
            const path = "./public"
            let arr= []
            fs.readdir(path, async (err, files) => {
                if (err) {
                    console.log(err)
                    reject()
                    return
                }
                for (var i = 0; i < files.length; i++){
                    if (await isDir(path + '/' + files[i])) {
                        arr.push(files[i])
                    }
                }
                resolve(arr) 
            })
        })
    }
    readDir().then(res => {
        console.log(res)
    })
    

    相关文章

      网友评论

          本文标题:Nodejs 中 fs 模块的使用

          本文链接:https://www.haomeiwen.com/subject/iaixwktx.html