Node.js 初识 fs 模块

简介:

fs 模块是文件操作的封装,它提供了文件的读取、写入、更名、删除、遍历目录、链接等 Unix 文件系统操作。与其他模块不同的是,fs 模块中所有的操作都提供了 同步 和 异步 两个版本,比如读取文件内容的函数有 异步的 fs.readFile() 和 同步的 fs.readFileSync().


Node.js 导入文件系统模块的语法如下:

1
var  fs = require( 'fs' );


1、异步和同步读取文件


fs.readFile(file[, options], callback(err,data))

异步读取文件的全部内容


参数:

file:  <String> | <Buffer> | <Integer>,要读取的文件名,必选参数       

options:  <Object> | <String>, 可选参数,可指定 flag(文件操作选项,如 r+ 读写;w+读写,文 件不存在则创建)及 encoding 属性

        encoding:  <String> | <Null>,表示文件的字符编码

        flag: <String>  ,默认 'r' 

callback <Function>,回调函数提供了两个参数 err 和 data,err 表示有没有错误发生,data 是文件内容


如果指定了第二个参数 encoding,回调函数中的 data 是一个解析后的字符串,否则 data 将会是以 Buffer 形式表示的二进制数据


新建一个 content.txt,里面添加一行简单的文本

1
你好,世界!


异步读取文件,示例代码如下:

1
2
3
4
5
6
7
8
9
var  fs = require( 'fs' );
 
fs.readFile( './content.txt' , {flag:  'r+' , encoding:  'utf8' },  function (err, data){
     if (err){
         console.error(err);
         return ;
     }
     console.log( '异步读取:' + data);
});


运行结果如下:

wKiom1hy-XPCiNIwAABhIHzbFBY311.png


当读取文件出现错误时,err 将会是 Error 对象。例如:读取一个不存在的 content1.txt 文件,运行代码时,会报如下错误。

wKioL1hy-oThdAJEAAB_3L6Prfs473.png


Node.js 的异步编程接口习惯是以函数的最后一个参数为回调函数,通常一个函数只有一个回调函数。回调函数的实际参数中第一个是 err,其余参数是其他返回内容。如果没有发生错误,err 的值会是 null 或 undefined。如果有错误发生,err 通常是 Error 对象的实例



fs.readFileSync(file[, options])

 fs.readFile 的同步版本,返回文件的内容


它接受的参数和 fs.readFile 相同,而读取到的文件内容会以函数返回值的形式返回。如果有错误发生,fs 将会抛出异常,需要使用 try 和 catch 捕捉并处理异常。


与同步 I/O 函数不同,Node.js 中异步函数大多没有返回值


同步读取文件示例:

1
2
3
4
5
6
var  fs = require( 'fs' );
 
//同步读取
var  data = fs.readFileSync( './content.txt' , 'utf8' );
console.log( '同步读取:' + data);
console.log( '程序执行完毕!' );


运行结果:

wKioL1hy_wyRwIOtAABi7vyJVsw730.png



2、获取文件信息


fs.stat(path, callback)

通过异步模式获取文件信息


参数:

path: <String> | <Buffer>,文件的路径

callback: <Function>,回调函数,带有两个参数 err 和 status,stats 是  fs.Stats  对象


fs.stat() 执行后,会将 stats 类的实例返回给其回掉函数。可以通过 stats 类中提供的方法判断文件的相关属性,例如:判断是否为文件夹

1
2
3
4
5
var  fs = require( 'fs' );
 
fs.stat( '/Users/liuht/code/itbilu/demo/fs.js' function  (err, stats) {
     console.log(stats.isFile());       //true
})


stats 类中的方法有:

wKiom1hzLlDgjmKvAAB7mAcW5P0907.png

新建一个 js 文件,代码如下:

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
var  fs = require( 'fs' );
 
console.log( '准备打开文件!' );
 
fs.stat( './content.txt' function (err, stats){
     if (err){
         console.err(error);
     }
     console.log(stats);
     console.log( '读取信息成功!' );
 
     //检测文件类型
     console.log( '是否为文件(isFile)?' + stats.isFile());
     console.log( '是否为目录(isDirectory)?' + stats.isDirectory());
})


运行结果:

wKioL1hzMU2wqjy1AAAur74m40g932.png



3、写入文件


fs.writeFile(file, data[, options], callback)

异步的方式把数据写入文件,如果文件存在,该方法写入的内容会覆盖旧的文件内容


参数:

file:  <String> | <Buffer> | <Integer>,要读取的文件名,必选参数       

data:  <String> | <Buffer> ,要写入的数据,可以是  <String>  也可以是  <Buffer> (对象流)

options:  <Object> | <String>, 

        encoding:  <String> | <Null>,表示文件的字符编码,默认'utf8'

        mode: <Integer> ,权限,默认 0o666 

        flag: <String>  ,默认 'w' 

callback <Function>,回调函数只包含错误信息参数(err),在写入失败时返回


如果 data 是一个 <Buffer> ,那么 option 中的 encoding 会被忽略掉,将默认为 'utf8'



示例代码:

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
var  fs = require( 'fs' );
 
console.log( '准备写入文件!' );
 
fs.writeFile( './content.txt' '我是异步写入的文件内容' function (err){
     if (err){
         console.err(error);
     }
     console.log( '数据写入成功!' );
     console.log( '--------------我是分割线---------------' );
     console.log( '读取写入的数据!' );
     fs.readFile( './content.txt' function (err, data){
         if (err){
             console.err(error);
         }
         console.log( '异步读取文件数据:'  +data);
 
     })
})


运行结果:

wKiom1hzN3_hzZbAAAAgBszE7XI670.png


同时,原来的 content.txt 中的内容变为:

wKioL1hzN7jgY-NzAAAQGOY4zsk058.png



fs.appendFile(file, data[, options], callback)

以追加的方式写入文件


示例代码:

1
2
3
4
5
6
7
8
9
10
11
12
13
14
var  fs = require( 'fs' );
 
fs.appendFile( './content.txt' '我是被追加写入的数据' function (err){
     if (err){
         console.log(error);
     }
});
 
fs.readFile( './content.txt' function (err, data){
     if (err){
         console.log(error);
     }
     console.log( '异步读取文件数据:'  +data);
})


运行结果:(在原数据后追加数据,不会覆盖原内容)

wKioL1hzO2fgZ1hNAAAR3cWfZ18739.png



4、读取文件


fs.read(fd, buffer, offset, length, position, callback(err, bytesRead, buffer))

从指定的文件描述符 fd 中读取数据并写入 buffer 指向的缓冲区对象


参数:

fd :  <Integer>,使用 fs.open 打开成功后返回的文件描述符

buffer : <String> | <Buffer> ,一个 buffer 对象,V8引擎分配的一段内存

offset : <Integer> ,整数,向缓存区中写入时的初识位置,以字节为单位

length : <Integer> ,整数,读取文件的长度

position : <Integer> ,整数,读取文件的初识位置;文件大小以字节为单位

如果 position  为 null,将从当前文件指针的位置读取

callback : <Function> ,读取执行完成后的回调函数,有三个参数 err, bytesRead, buffer

     - err:错误信息

     - bytesRead:表示读取的字节数

     - buffer:缓冲区对象


示例代码如下:

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
var  fs = require( 'fs' );
 
var  buf =  new  Buffer(1024);
 
console.log( '准备打开已存在的文件!' );
fs.open( './content.txt' 'r+' function (err, fd){
     if (err){
         console.error(err);
     }
     console.log( '文件打开成功!' );
     console.log( '准备读取文件:' );
     fs.read(fd, buf, 0, buf.length, 0,  function (err, bytes){
         if (err){
             console.error(err);
         }
         //每一个汉字utf8编码是3个字节
         console.log(bytes+  '字节被读取' );
 
         //仅输出读取的字节
         if (bytes >0){
             console.log(buf.slice(0, bytes));
         }
     })
});


运行结果:

wKioL1hzRpHT108YAAAgDyrf6QI824.png



5、打开文件


fs.open(path, flags[, mode], callback(err, fd))

异步的方式打开文件


path: <String> | <Buffer>,文件的路径

flags: <String> | <Number>,文件打开的行为,具体参考下表

mode: <Integer>,设置文件模式(权限),文件创建默认权限为 0666(可读,可写)

callback: <Function>,回调函数,带有两个参数 err 和 fd


flags 参数可以是以下值:

wKiom1hzAUrwnIfvAADGPloHgW0874.png


示例代码:以读写模式打开文件 content.txt

1
2
3
4
5
6
7
8
9
10
var  fs = require( 'fs' );
 
//异步打开文件
console.log( '准备打开文件!' );
fs.open( './content.txt' , 'r+' , function (err, fd){
     if (err){
         return  console.error(err);
     }
     console.log( '文件打开成功!' );
});


运行结果:

wKiom1hzBsDSH_zNAABuy2Wb2Tk231.png


fs.openSync(path, flags[, mode])

 fs.open() 的同步版本,返回一个  <Integer> 代表读取的文件



6、创建目录

fs.mkdir(path[, mode], callback(err))

创建目录


参数:

path : <String> | <Buffer> ,被创建目录的完整路径及目录名

[mode] : <Integer> ,整数,目录权限,默认 0777

callback : <Function> ,创建完目录回调函数,err 错误对象



示例代码:

1
2
3
4
5
6
7
8
9
10
var  fs = require( 'fs' );
 
console.log( '创建目录 /src/test' );
 
fs.mkdir( 'src/test' function (err){
     if (err){
         console.error(err);
     }
     console.log( '目录创建成功!' );
});


创建前截图:

wKiom1hzS0zg2es_AACknsbeZh0993.png


创建后截图:

wKioL1hzS5SjAZv2AACcI07G6M0493.png


本文转自   frwupeng517   51CTO博客,原文链接:http://blog.51cto.com/dapengtalk/1890453




相关文章
|
2月前
|
JavaScript
Node.js【GET/POST请求、http模块、路由、创建客户端、作为中间层、文件系统模块】(二)-全面详解(学习总结---从入门到深化)
Node.js【GET/POST请求、http模块、路由、创建客户端、作为中间层、文件系统模块】(二)-全面详解(学习总结---从入门到深化)
27 0
|
13天前
|
域名解析 网络协议 JavaScript
【Node系列】node工具模块
Node.js有多个内置的工具模块,这些模块提供了用于执行各种任务的功能。
22 2
|
28天前
11_nest.js模块
11_nest.js模块
24 0
|
1月前
|
JavaScript 前端开发
Node.js之path路径模块
Node.js之path路径模块
|
1月前
|
JavaScript
Node.js之http模块
Node.js之http模块
|
2月前
|
资源调度 JavaScript 关系型数据库
Node.js【文件系统模块、路径模块 、连接 MySQL、nodemon、操作 MySQL】(三)-全面详解(学习总结---从入门到深化)
Node.js【文件系统模块、路径模块 、连接 MySQL、nodemon、操作 MySQL】(三)-全面详解(学习总结---从入门到深化)
33 0
|
3月前
|
Web App开发 JavaScript 前端开发
了解 Node.js 的运行机制:从事件循环到模块系统(下)
了解 Node.js 的运行机制:从事件循环到模块系统(下)
了解 Node.js 的运行机制:从事件循环到模块系统(下)
|
3月前
|
JavaScript 前端开发 数据挖掘
了解 Node.js 的运行机制:从事件循环到模块系统(上)
了解 Node.js 的运行机制:从事件循环到模块系统(上)
了解 Node.js 的运行机制:从事件循环到模块系统(上)
|
关系型数据库 MySQL 数据库
|
2月前
|
Web App开发 缓存 JavaScript
【安装指南】nodejs下载、安装与配置详细教程
这篇博文详细介绍了 Node.js 的下载、安装与配置过程,为初学者提供了清晰的指南。读者通过该教程可以轻松完成 Node.js 的安装,了解相关配置和基本操作。文章首先介绍了 Node.js 的背景和应用场景,随后详细说明了下载安装包、安装步骤以及配置环境变量的方法。作者用简洁明了的语言,配以步骤图示,使得读者能够轻松跟随教程完成操作。总的来说,这篇文章为初学者提供了一个友好的入门指南,使他们能够顺利开始使用 Node.js 进行开发。
188 1
【安装指南】nodejs下载、安装与配置详细教程