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

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

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,里面添加一行简单的文本

你好,世界!

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

var fs = require('fs');fs.readFile('./content.txt', {flag: 'r+', encoding: 'utf8'}, function(err, data){if(err){console.error(err);return;}console.log('异步读取:'+ data);
});

运行结果如下:

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

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

fs.readFileSync(file[, options])

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

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

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

同步读取文件示例:

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

运行结果:

2、获取文件信息

fs.stat(path, callback)

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

参数:

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

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

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

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

stats 类中的方法有:

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

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());
})

运行结果:


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'

示例代码:

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);})
})

运行结果:

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

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

以追加的方式写入文件

示例代码:

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);
})

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

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:缓冲区对象

示例代码如下:

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));}})
});

运行结果:

5、打开文件

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

异步的方式打开文件

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

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

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

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

flags 参数可以是以下值:

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

var fs = require('fs');//异步打开文件
console.log('准备打开文件!');
fs.open('./content.txt','r+',function(err, fd){if(err){return console.error(err);}console.log('文件打开成功!');
});

运行结果:

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

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

6、创建目录

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

创建目录

参数:

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

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

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

示例代码:

var fs = require('fs');console.log('创建目录 /src/test');fs.mkdir('src/test', function(err){if(err){console.error(err);}console.log('目录创建成功!');
});

创建前截图:

创建后截图:

转载于:https://blog.51cto.com/dapengtalk/1890453

Node.js 初识 fs 模块相关推荐

  1. php node 目录,node.js基于fs模块对系统文件及目录进行读写操作的方法详解

    本文主要介绍了node.js基于fs模块对系统文件及目录进行读写操作的方法,结合实例形式分析了nodejs使用fs模块针对文件与目录的读写.创建.删除等相关操作技巧,需要的朋友可以参考下. 如果要用这 ...

  2. js处理本地.bin音频文件和node.js的fs模块处理本地.bin音频区别

    1.js处理本地.bin文件 <body><input type="file" name="" id="fileInput" ...

  3. node.js使用fs模块的renameSync方法报错“ EXDEV: cross-device link not permitted, rename ‘F‘ -> ‘G“

    异常 当使用fs模块的renameSync()方法时报错如下: Error: EXDEV: cross-device link not permitted, rename 'F:\trash.conf ...

  4. 利用async和await异步操作解决node.js里面fs模块异步读写,同步结果的问题

    async await 解决异步问题,这两个关键字是es7提出的,所以测试,node和浏览器版本提高一些 async await 操作基于promise实现的 async await这两个关键字是一起 ...

  5. node.js中模块_在Node.js中需要模块:您需要知道的一切

    node.js中模块 by Samer Buna 通过Samer Buna 在Node.js中需要模块:您需要知道的一切 (Requiring modules in Node.js: Everythi ...

  6. 浅析 Node.js 的 vm 模块以及运行不信任代码

    为什么80%的码农都做不了架构师?>>>    在一些系统中,我们希望给用户提供插入自定义逻辑的能力,除了 RPC 和 REST 之外,运行客户提供的代码也是比较常用的方法,好处是可 ...

  7. Node.js学习笔记——模块加载机制及npm指令详解

    文章目录 二.模块化 1.模块化的基本概念 2.Node.js 中的模块化 Node.js 中模块的分类 加载模块 Node.js 中的模块作用域 向外共享模块作用域中的成员 Node.js 中的模块 ...

  8. Node.js(一、Node.js基础、模块加载机制、包等)

    Node.js(一.Node.js基础.模块加载机制.包等) 1.Node.js基础 1.1.Node是什么 1.2.Node环境安装失败解决方法 1.2.1.Node环境搭建 1.2.2.错误代码2 ...

  9. 开场 Live,分享点干货——「深入了解 Node.js 包与模块机制」

    先放上 Live 地址: www.zhihu.com/lives/84274- 本次 Live 将深入剖析 Node.js 包与模块机制,包括且不限于解析 Node.js 源码.社区规范等.本人认为这 ...

最新文章

  1. 重磅消息:蚂蚁金服推出RPC框架
  2. 告别繁琐提升效率,Docker 帮您降低从开发到部署的复杂性
  3. 脑洞:如果地府需要一个后台管理系统,你会如何设计?
  4. windows 配置C++环境
  5. SQL注入绕过登录验证
  6. 在洛谷开了一个邀请赛
  7. 前端学习(3339):ant design中加上icon图标
  8. ImportError: cannot import name ‘render_to_response‘ 解决方法
  9. 数据结构--------二叉排序树
  10. chmod命令用法_Java开发人员必须掌握的Linux命令(一)
  11. 嵌入式软件c语言笔试题
  12. 夜曲歌词 拼音_周杰伦夜曲乐谱及歌词
  13. 域名邮箱用GMAIL,live
  14. HTML让文字在图片上显示
  15. 出现 -2146959355, ‘服务器运行失败‘ 错误的处理
  16. 无人驾驶-控制-阿克曼模型
  17. Android开发之WebDav
  18. 趣头条爬虫(以财经频道为例)
  19. 数字图像处理(冈萨雷斯版)学习笔记(6)第10章
  20. 维度数据建模的概念和术语

热门文章

  1. GCC __builtin_expect与kernel指令序列优化
  2. 小程序数据框有重影_微信小程序云开发数据库增删改查
  3. 采用APACHE POI操作EXCEL文件--计算式调用另一文件
  4. Powerdesigner数据库建模工具教程
  5. spring boot:创建一个简单的web(maven web project)
  6. 我的探究:为什么.h头文件中不要写using namespace std
  7. CentOS系统配置solr
  8. 1029 C语言文法定义
  9. 11gOCP 1z0-052 :2013-09-11 MGR_ROLE role........................................................A66
  10. 线程间操作无效 progressBar2线程不能被访问