Node核心API的fs模块学习(一)

2020-08-11124次阅读node

webpack配置中经常会碰到path、fs等API使用,之前总结过path模块。现在总结一下fs模块readFile与readFileSync读操作、writeFile与writeFileSync写操作、open与openSync方法打开文件、read与readSync和fsync方法从文件的指定位置处读取文件、close与closeSync方法关闭文件。

fs模块实现所有有关文件及目录的创建,写入及删除操作。在fs模块中,所有对文件及目录的操作都可以使用同步与异步这两种方法。比如在执行读文件操作时,可以使用readFile与readFileSync方法。在所有这些方法中,方法名中具有Sync后缀的方法均为同步方法,而不具有Sync后缀的方法均为异步方法。两者的区别是:在使用同步方法执行操作结束之前,不能执行后续代码。

 

文件的读操作readFile与readFileSync方法

fs.readFile(filename,[options<Object>|<string>],callback);

filename参数用于指定读取文件的完整文件路径及文件名(必选)

Options参数值为一个对象时,可以使用flag属性指定对该文件采取什么样的操作,默认值为 'r'(如果指定读取的文件不存在,则抛出异常)。可以指定的值如下:

  • 'r’: 读取文件,如果文件不存在则抛出异常。
  • 'r+’: 读取并写入文件,如果文件不存在则抛出异常。
  • 'w’:  写入文件。如果文件不存在则创建该文件,如果该文件已存在则清空文件内容。
  •  'wx’: 作用与'w'类似。
  • 'w+’ 读取并写入文件,如果文件不存在则创建该文件,如果该文件已存在则清空文件内容。
  • 'wx+’ 作用与'w+’类似。
  • 'a’ 追加写入文件,如果该文件不存在则创建该文件。
  • 'ax’ 作用与'a’类似。
  • 'a+’读取并追加写入文件,如果文件不存在则创建该文件。‘ax+’ 作用与’a+’类似。

也可使用encoding属性指定使用何种编码格式来读取该文件,可指定属性值为utf8,ascii与base64。

Callback参数用于文件读取完毕后执行的回调函数Function(err,data){}(必选)。其中第一个参数值为读取文件操作失败时候触发的错误对象,第二个参数值为读取到的文件内容。  

注意:当使用encoding属性指定编码格式时,会将文件内容以指定的编码格式输出编码后的字符串,当不指定编码格式时,输出值为一个存放了文件中原始二进制内容的缓存区对象。

var fs = require('fs');
/**options对象中未使用encoding属性指定编码格式,输出的是文件中原始二进制内容的缓存区对象,需data.toString()输出文本内容**/
fs.readFile('./test.txt',function(err,data){
    if(err) {
        console.log("读取文件时发生错误");
    }else {
        console.log(data.toString());
    }
});

/**options对象中使用encoding属性指定编码格式,data输出编码后的字符串**/
fs.readFile('./test.txt','utf8',function(err,data){
    if(err) {
        console.log("读取文件时发生错误");
    }else {
        console.log(data);
    }
});

readFileSync同步方法:

var fs = require('fs');
try{
    var data = fs.readFileSync('./test.txt','utf8');
    console.log(data);
}catch(e){
    console.log("读取文件时发生错误。");
}

 

文件的写操作writeFile、writeFileSync、appendFile、appendFileSync方法

在完整写入一个文件时,我们可以使用fs模块的writeFile与writeFileSync方法。

fs.writeFile(filename,data,[options],callback);

filename参数用于指定需要被写入文件的完整文件路径及文件名(必选)

data参数用于指定需要写入的内容,可以是一个字符串或一个buffer对象,该字符串或缓存区中的内容将被完整地写入到文件中(必选)

Options参数值为一个对象时,可以使用如下的属性值。

flag属性:用于指定对该文件采取何种操作,默认值'w'(文件不存在时创建该文件,文件已存在时重写该文件)可指定值及其含义与readFile方法中使用的flag属性值及其含义相同。

mode属性:用于指定当文件被打开时对该文件的读写权限,默认值为0666(可读写)。该属性值使用4个参数组成,其中第一个数字必须为0,第二个数字用于规定文件或目录所有者的权限,第三个数字用于规定文件或目录所有者所属用户组的权限,第四个数字规定其他人的权限,可以设定的数字如下所示:

1. 执行权限

2. 写权限

3. 读权限

如果需要设置读写等复合权限,可以对以上三个数字进行加运算。

var fs = require('fs');
fs.writeFile('./message.txt',"这是第一行。\r\n这是第二行.",function(err){
    if(err) {
        console.log("写文件操作失败");
    }else {
        console.log("写文件操作成功");
    }
});

var data = new Buffer("这是一个提示文字");
fs.writeFile('./tips.txt',data,function(err){
    if(err) {
        console.log("写文件操作失败");
    }else {
        console.log("写文件操作成功");
    }
});


var options = {
    flag: 'a'
};

fs.writeFile('./message.txt','这是追加的数据。',options,function(err){
    if(err) {
        console.log("写文件操作失败");
    }else {
        console.log("写文件操作成功");
    }
});

图片覆盖栗子:

var fs = require('fs');
fs.readFile("./1.gif",'base64',function(err,data){
    fs.writeFile('./2.gif',data.toString(),'base64',function(err){
        if(err) {
            console.log("写文件操作失败");
        }else {
            console.log("写文件操作成功");
        }
    });
});

appendFile和appendFileSync方法

将一个字符串或一个缓存区中的数据追加到一个文件底部。

fs.appendFile(filename,data,[options],callback);

在appendFile方法中使用4个参数与writeFile方法所使用的4个参数的作用与指定方法大致相同,区别在于options参数值对象中,flag属性的默认属性值为'a'(在文件底部追加写入数据,如果文件不存在,则创建该文件)。

 

从指定位置处开始读写文件open、openSync、read、readSync、write、writeSync、close、closeSync方法

从指定位置处开始读写文件的处理,我们首先需要使用fs模块中的open与openSync方法打开文件。

fs.open(filename,flags,[mode],callback);

在打开文件后,可以在回调函数中使用fs模块中的read与readSync方法从文件的指定位置处读取文件,也可以调用fs模块中的write与writeSync方法从文件的指定处开始写入数据。

fs.read(fd,buffer,offset,length,position,callback);
  • fd参数值必须为open或openSync方法回调函数中返回的文件描述符;
  • buffer参数值为一个Buffer对象,用于指定将文件数据读取到那个缓存区中。
  • offset参数用于指定向缓存区中写入数据时的开始写入位置(以字节为单位)。
  • length参数用于指定从文件中读取的字节数。
  • position参数用于指定读取文件时的开始位置(以字节为单位)。
  • Callback参数用于指定文件读取操作执行完毕后的回调函数Function (err,bytesRead,buffer){}。其中err为读取文件操作失败时所触发的错误对象,bytesRead为一个整数值,代表实际读取的字节数,buffer为被读取的缓存区的对象。
var fs = require('fs');
fs.open('./message.txt','r',function(err,fd){
    var buf = new Buffer(255);
    // 一个汉字的utf编码为三个字节数据
    fs.read(fd,buf,0,9,3,function(err,bytesRead,buffer){
        console.log(buffer.slice(0,bytesRead).toString());
        // 从文件的当前读取位置继续往下读取
        fs.read(fd,buf,0,3,null,function(err,bytesRead,buffer){
            console.log(buffer.slice(0,bytesRead).toString());
        });
    });
});

close与closeSync方法

在fs模块中,提供close与closeSync方法关闭文件;

fs.close(fd,[callback]);

fd参数值必须为open或openSync方法回调函数中返回的文件描述符返,callback参数为一个可选参数,用于指定关闭文件操作结束时执行的回调函数,在回调函数中使用一个参数,参数值为关闭文件操作失败时触发的错误对象。

var fs = require('fs');
var buf = new Buffer("我喜爱编程");
fs.open('./a.txt','wx',function(err,fd){
    fs.write(fd,buf,0,15,0,function(err,written,buffer){
        if(err) {
            console.log("写文件操作失败");
        }else {
            console.log("写文件操作成功");
            fs.close(fd);
        }
    });
});

在使用write或writeSync方法在文件中写入数据时,操作系统的做法是首先将该部分数据读到内存中,再把数据写到文件中,当数据读完时并不代表数据已经写完,因为还有部分数据有可能留在内存缓冲区中,这时如果我们调用close或closeSync方法关闭文件,那么这部分的数据就会丢失,这时我们可以使用fs模块中的fsync方法对文件进行同步操作,即将内存缓冲区中的剩余数据全部写入文件。

fs.fsync(fd,[callback]);

代码可以如下:

var fs = require('fs');
var buf = new Buffer("我喜爱编程");
fs.open('./a.txt','w',function(err,fd){
    fs.write(fd,buf,0,15,0,function(err,written,buffer){
        if(err) {
            console.log("写文件操作失败");
        }else {
            console.log("写文件操作成功");
            fs.fsync(fd);
            fs.close(fd);
        }
    });
});

转载自:https://www.cnblogs.com/tugenhua0707/p/4472535.html

上一篇: Git基本常用命令记录一下  下一篇: Node核心API的fs模块学习(二)  

Node核心API的fs模块学习(一)相关文章