Nodejs 中 fs 模块的使用

2020-11-27  本文已影响0人  shadow123

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)
})
上一篇下一篇

猜你喜欢

热点阅读