Node.js 初识 fs 模块
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 模块相关推荐
- php node 目录,node.js基于fs模块对系统文件及目录进行读写操作的方法详解
本文主要介绍了node.js基于fs模块对系统文件及目录进行读写操作的方法,结合实例形式分析了nodejs使用fs模块针对文件与目录的读写.创建.删除等相关操作技巧,需要的朋友可以参考下. 如果要用这 ...
- js处理本地.bin音频文件和node.js的fs模块处理本地.bin音频区别
1.js处理本地.bin文件 <body><input type="file" name="" id="fileInput" ...
- 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 ...
- 利用async和await异步操作解决node.js里面fs模块异步读写,同步结果的问题
async await 解决异步问题,这两个关键字是es7提出的,所以测试,node和浏览器版本提高一些 async await 操作基于promise实现的 async await这两个关键字是一起 ...
- node.js中模块_在Node.js中需要模块:您需要知道的一切
node.js中模块 by Samer Buna 通过Samer Buna 在Node.js中需要模块:您需要知道的一切 (Requiring modules in Node.js: Everythi ...
- 浅析 Node.js 的 vm 模块以及运行不信任代码
为什么80%的码农都做不了架构师?>>> 在一些系统中,我们希望给用户提供插入自定义逻辑的能力,除了 RPC 和 REST 之外,运行客户提供的代码也是比较常用的方法,好处是可 ...
- Node.js学习笔记——模块加载机制及npm指令详解
文章目录 二.模块化 1.模块化的基本概念 2.Node.js 中的模块化 Node.js 中模块的分类 加载模块 Node.js 中的模块作用域 向外共享模块作用域中的成员 Node.js 中的模块 ...
- 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 ...
- 开场 Live,分享点干货——「深入了解 Node.js 包与模块机制」
先放上 Live 地址: www.zhihu.com/lives/84274- 本次 Live 将深入剖析 Node.js 包与模块机制,包括且不限于解析 Node.js 源码.社区规范等.本人认为这 ...
最新文章
- 重磅消息:蚂蚁金服推出RPC框架
- 告别繁琐提升效率,Docker 帮您降低从开发到部署的复杂性
- 脑洞:如果地府需要一个后台管理系统,你会如何设计?
- windows 配置C++环境
- SQL注入绕过登录验证
- 在洛谷开了一个邀请赛
- 前端学习(3339):ant design中加上icon图标
- ImportError: cannot import name ‘render_to_response‘ 解决方法
- 数据结构--------二叉排序树
- chmod命令用法_Java开发人员必须掌握的Linux命令(一)
- 嵌入式软件c语言笔试题
- 夜曲歌词 拼音_周杰伦夜曲乐谱及歌词
- 域名邮箱用GMAIL,live
- HTML让文字在图片上显示
- 出现 -2146959355, ‘服务器运行失败‘ 错误的处理
- 无人驾驶-控制-阿克曼模型
- Android开发之WebDav
- 趣头条爬虫(以财经频道为例)
- 数字图像处理(冈萨雷斯版)学习笔记(6)第10章
- 维度数据建模的概念和术语
热门文章
- GCC __builtin_expect与kernel指令序列优化
- 小程序数据框有重影_微信小程序云开发数据库增删改查
- 采用APACHE POI操作EXCEL文件--计算式调用另一文件
- Powerdesigner数据库建模工具教程
- spring boot:创建一个简单的web(maven web project)
- 我的探究:为什么.h头文件中不要写using namespace std
- CentOS系统配置solr
- 1029 C语言文法定义
- 11gOCP 1z0-052 :2013-09-11 MGR_ROLE role........................................................A66
- 线程间操作无效 progressBar2线程不能被访问