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

你可能感兴趣的:(Node.js学习——常用fs模块)