Node.js文件系统

Node文件系统方法总结

Posted by wang chong on January 23, 2019

文件模块

引入文件模块

const fs = require(‘fs’);

异步与同步文件操作的区别

异步方法性能更高、速度更快、而且没有阻塞

打开文件–异步

fs.open(path,flags,mode,callback);
  1. path:文件的路径
  2. flags:文件打开的行为。
  3. model:设置文件模式(权限),文件创建默认权限为0666(可读可写);
    1. r:以读取模式打开文件。如果文件不存在抛出异常
    2. r+:以读写模式打开文件,如果文件不存在抛出异常
    3. rs:以同步的方式读取文件
    4. rs+:以同步的方式读取和写入文件
    5. w:以写入模式打开文件,如果文件不存在则创建
    6. wx:类似于w,但是如果文件路径存在,则文件写入失败
    7. w+:以读写模式打开文件,如果文件不存在则创建
    8. wx+:类似w+,但是如果文件路径存在,则文件读写失败
    9. a:以追加模式打开文件,如果文件不存在则创建
    10. ax:类似于a,但是如果文件路径存在,则文件追加失败
    11. a+:以读取追加模式打开文件,如果文件不存在则创建
    12. ax+:类似a+,但是如果文件路径存在,则文件读取追加失败
  4. callback:回调函数,带有两个参数:callback(err,fd)
    1. err是错误对象
    2. fd:表示所打开的文件有多少行
fs.open('test.js','r+',(err,fd) => {
    if(err){
        return console.log(err);
    }
    console.log(fd);
});

获取文件信息

fs.stat(path,callback)
  1. path:文件路径
  2. callback:回调函数,带有两个参数:err,states,states是fs.States对象
fs.stat('test.js',(err,stats)=> {
    if(err){
        return console.error(err);
    }
    console.log(stats);
})
stats类中的方法
  1. stats.isFile():如果是文件返回true,否则返回false
  2. stats.isDirectory():如果是目录返回true,否则返回false
  3. stats.isBlockDevice():如果是块设备返回true,否则返回false
  4. stats.isCharacterDevice():如果是字符设备返回true,否则返回false
  5. stats.isSymbolicLink():如果是软链接返回true,否则返回false
  6. stats.isFIFO():如果是FIFO返回true,否则返回false。FIFO是UNIX中的一种特殊类型的命令管道
  7. stats.isSocket():如果是Socket返回true,否则返回false

写入文件

同步写入文件
fs.writeFileSync('test1.js','fdsafdaf');
console.log('写入成功');
异步写入文件
fs.writeFile(file,data,{options},callback)

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

  1. file:文件名或文件描述符
  2. data:要写入文件的数据,可能是String(字符串)或Buffer(缓冲)对象;
  3. options:该参数是一个对象,包含{encoding、mode、flag}。默认编码utf8,模式为0666,flag为‘w’
  4. callback:回调函数,回调函数只包含出错信息参数(err),在写入失败时返回。
console.log('准备写入文件!');
fs.writeFile('test1.js','写入成功!!!!!',(err)=> {
    if(err){
        return console.error(err);
    }
    console.log('数据写入成功!');
    console.log('-------我是分割线--------');
    console.log('读取写入的数据');
    fs.readFile('test1.js',(err,data) => {
        if(err){
            return console.error(err);
        }
        console.log('异步读取文件数据:' + data.toString());
    })
})

读取文件

同步读取文件
const data = fs.readFileSync('test1.js');
console.log(data.toString());
异步读取文件
使用fs.readFile(path,{options},callback)
  1. path:读取文件的路径
  2. options:{encoding,flag},encoding:null,flag:r
  3. callback:err,data;第一个参数是err,第二个参数是读取出的信息。
fs.readFile('test1.js',{encoding:'utf8'},(err,data) => {
    if(err){
        return console.error(err);
    }
    console.log(data);
})
使用fs.read(fd,buffer,offset,length,position,callback);
  1. fd:通过fs.open()方法返回的文件描述符
  2. buffer:数据写入的缓冲区
  3. offset:缓冲区写入的写入偏移量
  4. length:要从文件中读取的字节数
  5. position:文件读取的起始位置,如果position的值为null,则会从当前文件指针的位置读取
  6. callback:回调函数,有三个参数err、byteRead、buffer。err为错误信息,byteRead表示读取的字节数,buffer为缓冲区对象
var buffer = new Buffer.alloc(1024);
fs.open('test1.js','r+',(err,fd) => {
    if(err){
        return console.error(err);
    }
    console.log('打开文件成功!');
    console.log('准备打开文件!');
    fs.read(fd,buffer,'0',buffer.length,0,(err,byteRead,buffer) => {
        if(err){
            return console.error(err);
        }
        console.log(byteRead + '字符被读取');
        console.log(buffer.toString());
    })
})

关闭文件

fs.close(fd,callback) 异步关闭文件
  1. fd:通过fs.open()方法返回的文件描述符
  2. callback:回调函数
fs.open('test1.js','r+',(err,fd) => {
    if(err){
        return console.error(err);
    }
    console.log('文件打开成功!');
    fs.close(fd,()=>{
        console.log('文件关闭成功!');
    })
}) 
fs.closeSync(fd) 同步关闭文件
  1. fd:通过fs.open()方法返回的文件描述符
fs.open('test1.js','r+' ,(err,fd) => {
    if(err){
        return console.error(err);
    }
    console.log('文件打开成功!');
    fs.closeSync(fd);
    console.log('文件关闭成功!');
}) 

截取文件

fs.ftruncate(fd,len,callback) 异步截取

  1. fd:通过fs.open()方法返回的文件描述符
  2. len:文件内容截取的长度
  3. callback:回调函数
fs.open('test1.js','r+',(err,fd) => {
    if(err){
        return console.error(err);
    }
    console.log('打开文件成功!');
    console.log('开始截取文件');
    fs.ftruncate(fd,10,() => {
        console.log('截取文件成功!');
        fs.close(fd,() =>{
            console.log('文件关闭成功!');
        })
    });
})

删除文件

fs.unlink(path,callback);

  1. path:文件路径
  2. callback:回调函数
fs.writeFile('123.txt','123345456',(err)=> {
    if(err){
        return console.error(err);
    }
    console.log('写入文件成功!');
    fs.unlink('123.txt',()=>{
        console.log('删除123.txt');
    })
})

创建目录

fs.mkdir(path,[options],callback)

  1. path:文件路径
  2. options:
    1. recursive:是否以递归的方式创建目录,默认为false
    2. mode:设置目录权限,默认为0777
  3. callback:回调函数
fs.mkdir('/test1/test/app',{recursive:true},(err) => {
    if(err){
        return console.log(err);
    }
    console.log('test目录创建成功');
})

读取目录

fs.readdir(path,callback)

  1. path:文件路径
  2. callback:回调函数,回调函数带有两个参数,err,files,err为错误信息,files是目录下的文件数组列表
fs.readdir('test/',(err,files) => {
    if(err){
        return console.error(err);
    }
    console.log(files); //['test']
}) 

删除目录

fs.rmdir(path,callback)

  1. path:文件路径
  2. callback:回调函数
fs.rmdir('test/test/',(err) => {
    if(err){
        return err;
    }
    console.log('删除成功!');
})