node.js学习笔记之fs模块

作者: 小母鸡叽叽叽 | 来源:发表于2017-01-07 17:00 被阅读838次

    本文基于Node.js v6.9.4,详情请参考官网API

    • 文件操作推荐使用绝对路径(__dirname + filename);
    • 错误优先原则,callback 默认第一个参数都是err

    一、文件操作

    // 引入fs和path模块 
      var fs = require('fs');
      var path = require('path');
       // 定义要操作的文件路径
      var PATH = path.join(__dirname,'./test.json');
    

    1. 异步读取文件

    /* fs.readFile(filename[, options], callback)
    *  filename 必选参数,文件名
    *  [options] 可选参数,可指定encodeing (如'utf8');可指定flag(默认为'r',只读)
    *  callback 读取文件后的回调函数,参数默认第一个err, 第二个为 data
    */
    fs.readFile(PATH,(err, res) => {
            if(err){ return console.log(error); }
            console.log('异步读取成功:'+ res);
    });
    

    **2. 同步读取文件 **

    // fs.readFileSync(filename[, options])
    var data = fs.readFileSync(PATH);
    console.log('同步读取'+data.toString());
    

    3. 异步写文件

    // fs.writeFile(file, data[, options], callback) 请确保data是string类型
    fs.writeFile(PATH,'{"a":"我是通过写入的内容"}',(err) => {
       if(err){ return console.error(err);}
        console.log('文件写入成功');
    });
    

    4. 同步写文件

    fs.writeFileSync(file, data[, options])
    

    5. 以追加方式异步写入文件

    // fs.appendFile(filename,data,[options],callback)
     fs.appendFile(PATH,'// 我只是一只小母鸡',(err) => {
        if(err){return console.error(err);}
         console.log('文件写入成功');
     });
    

    **6. 以追加方式同步写入文件 **

    fs.appendFileSync(filename,data,[options])
    

    7. 流式文件写入

    // fs.createWriteStream(path[, options])
    var streamWriter = fs.createWriteStream(path.join(__dirname,'./test.json'));
    streamWriter.write('hello', () => {
        console.log('写入成功!');
    });
    

    8. 文件改名

    // fs.rename(oldPath, newPath, callback)
    fs.rename('serve.js','http.js',(err) => {
        if(err){return console.error(err);}
        console.log('文件改名成功!');
    });
    

    **9. 文件异步删除 **

    // fs.unlink(path, callback)
    fs.unlink('./test.json', (err) => {
        if(err){ console.log(err); }
        console.log('文件删除成功!');
    });
    

    10. 文件同步删除

    fs.unlinkSync(path)
    

    11. 打开文件

    // fs.open(path, flags[, mode], callback)
    /**
     * path, 必选参数,文件路径
     * flags, 操作标识,如"r",读方式打开
     * [mode],权限,如777,表示任何用户读写可执行
     * callback 打开文件后回调函数,参数默认第一个err,第二个fd为一个整数,表示打开文件返回的文件描述符,window中又称文件句柄
     */
    fs.open(PATH, 'r+', (err, fd) => {
       if(err){
           return console.error(err);
       }
        // 截取文件
        fs.ftruncate(fd, 10, (err) => {
           if(err){console.log(err);}
        });
        var buf = new Buffer(1024);
        fs.read(fd, buf, 0, buf.length, 0, (err, bytes) => {
           if(err){
               console.log(err);
           }
            console.log(bytes + '字节被读取');
            // 仅输出读取的字节
            if(bytes >0 ){
                console.log(buf.slice(0,bytes).toString());
            }
            // 刷新缓存
            fs.fsync(fd);
    
            // 关闭文件
            fs.close(fd,(err) => {
                if(err){
                    console.log(err);
                }
                console.log('文件关闭');
            })
        });
    });
    

    12. 文件监视

    // fs.watchFile(filename[, options][, listener])
    /*
    * [options], persistent true表示持续监视,interval单位毫秒,表示每隔多少毫秒监视一次文件
    * listener,文件变化时回调函数有两个参数,curr为一个fs.Stat对象,被修改后文件,prev,修改前fs.stat对象
    * */
    fs.watchFile(__dirname+'/fs.md', (curr, prev) => {
        console.log('fs.md文件发生变化');
    })
    

    13. 取消监视文件

    //fs.unwatchFile(filename, [listener])
    /*
    * filename,文件名
    * listener,要取消的监听事件,如果不指定,则取消所有监听处理事件
    * */
    var listener = (curr, prev) => {
        console.log(curr);
    }
    fs.unwatchFile(__dirname+'/fs.md', listener);
    

    二、目录操作

    1. 创建目录

    // fs.mkdir(path, [mode], callback)
    // 在当前目录下 的app目录下,创建一个js文件夹
    fs.mkdir(__dirname + 'app/js', (err) => {
        if(err){console.log(err);}
        console.log('目录创建成功!');
    });
    

    **2. 删除目录 **

    // fs.rmdir(path, callback)
    fs.rmdir('app', (err) => {
       if(err){return console.error(err);}
        console.log('目录删除成功!');
    });
    

    3. 读取目录

    // fs.readdir(path, callback)
    /**
     * path, 要读取目录的完整路径及目录名;
     * [callback(err, files)], 读完目录回调函数;err错误对象,files数组,存放读取到的目录中的所有文件名
     */
    

    4. 目录改名

    // fs.rename(oldPath, newPath, callback)
    fs.rename(__dirname + 'app/',__dirname + 'dist/',(err) => {
        if(err){return console.error(err);}
        console.log('文件改名成功!');
    });
    

    三、文件或目录操作

    1. 监视目录或文件

    fs.watch 不太稳定,在不同系统上可能有兼容性问题

    // fs.watch(filename, [options], [listener])
    /*
    * filename 完整路径及文件名或目录名
    * [options] ,可选参数,可设置编码格式encoding(如'utf8');persistent(true/false),指定进程是否继续运行,当文件被监控到变化时;recursive(true/false),指定子文件夹是否会被监控
    * [listener(event, filename)],监视器事件,有两个参数,event为事件名,filename为变化的文件名
    * */
    
    var fsWatcher = fs.watch(__dirname+'/fs.md', (event, filename) =>{
        console.log('event',event);
        console.log('filename',filename);
    })
    

    2. 查看文件或目录是否存在

    // fs.existsSync(path)
    

    3. 查看文件或目录的信息,通常在读写文件之前使用

    // fs.stat(path,callback)
    /*
    * callback(err, stats) 回调函数提供了两个参数,err,错误信息;stats,文件状态信息,stats还有一下方法
    * */
    fs.stat(__dirname+'/fs.md', (err,stats) => {
        if(err){
            throw  Error(err)
        }
        // 是否文件
        stats.isFile();
        // 是否问文件夹
        stats.isDirectory();
        // 是否为块设备
        stats.isBlockDevice();
        // 是否为字符设备
        stats.isCharacterDevice();
        // 是否为FIFO
        stats.isFIFO();
        // 是否为Socket
        stats.isSocket();
    })
    

    相关文章

      网友评论

        本文标题:node.js学习笔记之fs模块

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