前端实用Web前端之路前端开发那些事

node.js学习笔记之fs模块

2017-01-07  本文已影响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();
})
上一篇下一篇

猜你喜欢

热点阅读