Node.js FS模块方法速查
1. File System
- 所有文件操作提供
同步
和异步
的两种方式,本笔记只记录异步的API - 异步方式其最后一个参数是回调函数。回调函数的第一个参数往往是错误对象,如果没有发生参数,那么第一个参数可能是
null
或者undefinded
。 - 同步函数可以使用
try catch
捕获异常 - 多个异步函数在同一层次执行,是
无法保证顺序
的。最好将一个函数放在另一个函数的回调函数中去执行。这种回调的嵌套层次一旦过深,就会造成回调地狱
- 一般情况下,
非常不建议使用同步
的fs方法,因为同步的方法会阻断其他事情,直到fs方法完成。
1.1. 文件路径
filepaths目前支持4中
string
Buffer
URL Object
- 以
file:
开头的协议
- string 路径会被解释为utf-8格式,可以使用相对路径和绝对路径,相对路径是当前工作路径,可以从
process.cwd()
获取当前工作路径。
1.2. 文件描述符
- 操作系统会限制文件描述符的数量
- 忘记关闭文件可能导致
内存泄露
或者程序崩溃
- 任何文件描述符都支持写操作
- 如果文件描述符的类型是文件,那么它不会自动关闭
- 写操作会从文件的开头,而不会覆盖之后的内容。举例:文件内容是
Hello World
, 如果在写入'Aloha',那么文件的内容是Aloha World
,而不是'Aloha'.
1.3. 线程池使用
fs所有的api,除了那些同步的api和fs.FSWatcher(), 基本上都使用libuv的线程池。在有些应用程序上,这个可能导致非常糟糕的性能表现。libuv的线程池有固定的大小,默认只有4个,可以通过设置环境变量UV_THREADPOOL_SIZE
去增加libuv的线程的数量。
1.4. Class: fs.Dirent 判断文件类型
- 当
fs.readdir()
或者fs.readdirSync()
被调用,并且参数withFileTypes
是true
, 那么返回结果就是fs.Dirent objects
, 而不是strings
orBuffers
dirent方法
- dirent.isBlockDevice()
- dirent.isCharacterDevice()
- dirent.isDirectory()
- dirent.isFIFO()
- dirent.isFile()
- dirent.isSocket()
- dirent.isSymbolicLink()
- dirent.name
1.5. Class: fs.FSWatcher 文件变动监控
来自 fs.watch()
Event
change
close
error
- watcher.close()
注意:某些系统可能不会返回filename。如果encoding参数是buffer,那么文件名是以buffer的形式返回,默认文件名是utf-8格式的字符串。
fs.watch('./tmp', { encoding: 'buffer' }, (eventType, filename) => {
if (filename) {
console.log(filename);
// Prints: <Buffer ...>
}
});
1.6. Class: fs.ReadStream 可读流
来自fs.createReadStream()
Event
close
open
ready
第一次触发是在open事件之后
- readStream.bytesRead
- readStream.path
- readStream.pending
1.7. Class: fs.Stats 获取文件信息
来自 fs.stat()
, fs.lstat()
and fs.fstat()
以及他们的同步版本。
- stats.isBlockDevice()
- stats.isCharacterDevice()
- stats.isDirectory()
- stats.isFIFO()
- stats.isFile()
- stats.isSocket()
- stats.isSymbolicLink()
Stats {
dev: 2114,
ino: 48064969,
mode: 33188,
nlink: 1,
uid: 85,
gid: 100,
rdev: 0,
size: 527,
blksize: 4096,
blocks: 8,
atimeMs: 1318289051000.1,
mtimeMs: 1318289051000.1,
ctimeMs: 1318289051000.1,
birthtimeMs: 1318289051000.1,
atime: Mon, 10 Oct 2011 23:24:11 GMT,
mtime: Mon, 10 Oct 2011 23:24:11 GMT,
ctime: Mon, 10 Oct 2011 23:24:11 GMT,
birthtime: Mon, 10 Oct 2011 23:24:11 GMT }
1.8. Class: fs.WriteStream 可写流
Event
- close
- open
- ready
- writeStream.bytesWritten
- writeStream.path
- writeStream.pending
2. 常用方法
测试
访问权限测试
fs.access(path[, mode], callback) 测试是否可以访问某个路径。不建议fs.open(), fs.readFile() or fs.writeFile()调用前,调用fs.access去检查
测试路径是否存在
fs.exists(path, callback), 不建议fs.open(), fs.readFile() or fs.writeFile()调用前,调用fs.exists去检测文件是否存在流操作
创建可读流
fs.createReadStream(path[, options])创建可写流
fs.createWriteStream(path[, options])
文件夹操作
创建文件夹
fs.mkdir(path[, options], callback)删除目录
fs.rmdir(path, callback)创建临时文件夹
fs.mkdtemp(prefix[, options], callback)读取文件夹
fs.readdir(path[, options], callback)
文件操作
打开文件
fs.open(path[, flags[, mode]], callback)读取文件
fs.read(fd, buffer, offset, length, position, callback)读取文件
fs.readFile(path[, options], callback)重命名文件
fs.rename(oldPath, newPath, callback)读取文件信息
fs.stat(path[, options], callback)删除文件
fs.unlink(path, callback)停止监控文件
fs.unwatchFile(filename[, listener])修改时间
fs.utimes(path, atime, mtime, callback)监控文件变化
fs.watch(filename, options)关闭文件
fs.close(fd, callback)追加文件
fs.appendFile(path, data[, options], callback)改变文件模式
fs.chmod(path, mode, callback)改变文件所属
fs.chown(path, uid, gid, callback)复制文件
fs.copyFile(fs.copyFile(src, dest[, flags], callback))写文件
fs.write(fd, buffer[, offset[, length[, position]]], callback)写文件
fs.write(fd, string[, position[, encoding]], callback)写文件
fs.writeFile(file, data[, options], callback)
其他
fs常量
fs.constants
注意事项
fs.watch
并不是百分百跨平台。例如它的recursive
参数仅支持macOS和windows。fs.watch的底层通知机制在不同平台上的实现是不同的,如果底层不支持某个特性,那么fs.watch也是不能支持的。另外回调函数中的filename参数,也是不保证一定存在。fs.watch()
比fs.watchFile()
更高效,可能的话,尽量使用前者。
3. 参考
原文地址:https://segmentfault.com/a/1190000017359113
Node.js FS模块方法速查的更多相关文章
- 从官网学习Node.js FS模块方法速查
最新文档请查看仓库 https://github.com/wangduandu... 1. File System 所有文件操作提供同步和异步的两种方式,本笔记只记录异步的API 异步方式其最后一个参 ...
- Node.js——fs模块(文件系统),创建、删除目录(文件),读取写入文件流
/* 1. fs.stat 检测是文件还是目录(目录 文件是否存在) 2. fs.mkdir 创建目录 (创建之前先判断是否存在) 3. fs.writeFile 写入文件(文件不存在就创建,但不能创 ...
- Node.js的安装以及Node.js的模块管理
索引: Node.js的安装以及Node.js的模块管理Node.js开发环境搭建以及对ES6的支持Node.js构建Vue.js项目Vue.js单文件组件的开发基于Vue.js的UI组件(Eleme ...
- [Nodejs] node的fs模块
fs 模块 Node.js 提供一组类似 UNIX(POSIX)标准的文件操作 API. Node 导入文件系统模块(fs).Node.js 文件系统(fs 模块)模块中的方法均有异步和同步版本,例如 ...
- 【node】fs模块,文件和目录的操作
检查文件是否存在,查询文件信息 fs.stat() fs.stat('./server.js', function (err, stat) { if (stat && stat.isF ...
- Node.js:模块系统、函数
为了让Node.js的文件可以相互调用,Node.js提供了一个简单的模块系统. 模块是Node.js 应用程序的基本组成部分,文件和模块是一一对应的.换言之,一个 Node.js 文件就是一个模块, ...
- Node.js:模块系统
ylbtech-Node.js:模块系统 1.返回顶部 1. Node.js模块系统 为了让Node.js的文件可以相互调用,Node.js提供了一个简单的模块系统. 模块是Node.js 应用程序的 ...
- Node.js之模块机制
> 文章原创于公众号:程序猿周先森.本平台不定时更新,喜欢我的文章,欢迎关注我的微信公众号. ![file](https://img2018.cnblogs.com/blog/830272/20 ...
- Node.js核心模块-http
通过node中的http模块可以创建编写服务器 引入 const http = require('http') http举例使用: const http = require('http') //引入 ...
随机推荐
- G.subsequence 1(dp + 排列组合)
subsequence 1 时间限制:C/C++ 1秒,其他语言2秒 空间限制:C/C++ 262144K,其他语言524288K 64bit IO Format: %lld 题目描述 You are ...
- Java常考面试题整理(三)
明天又要去面试,Good luck to me.,让我在这段时间换个新的工作吧. 41.在Java中,对象什么时候可以被垃圾回收? 参考答案: 当对象对当前使用这个对象的应用程序变得不可触及的时候,这 ...
- Spring理解?
(1)Spring是一个轻量级控制反转(IoC)和面向切面(AOP)的容器框架,是解决企业应用开发的复杂性,为J2EE应用提供了全方位的整合框架,在Spring框架下实现多个子框架的组合. (2)Sp ...
- c#使用SharpZipLib对二进制数据进行压缩和解压
首先需要下载SharpZipLib,下载地址:http://icsharpcode.github.io/SharpZipLib/ 需要引入命名空间: using ICSharpCode.SharpZi ...
- 使用OMF特性
Oracle 的OMF全称"Oracle managed file",关于这个概念的参考请自行查阅Oracle官方文档"Using Oracle-Managed File ...
- flutter textfield
释放光标 FocusScope.of(context).unfocus() 输入类型 keyboardType: TextInputType.number, 键盘右下角按键类型 textInputAc ...
- 阶段3 2.Spring_10.Spring中事务控制_11 spring5新特性的介绍
jdk1.7和1.8的差别 准备好的一个maven工程 反射创建对象10亿次 ,用的时间 替换jdk的版本 选择为1.7 切换了1.7的版本以后呢执行的速度就变的非常的慢 两个版本的对比 响应式编程风 ...
- ASP.NET MVC 发布WIN SERVER2012
首先在打开服务器管理,点添加角色和功能 这个名字自己设置不打紧 勾选web服务器,之后点下一步 在功能选择中勾选下面部分 之后点击工具选择服务,确保web服务正在运行 此时服务端告一段落,返回主机打开 ...
- 取长文本 READ_TEXT
****取长文本 FORM GET_TEXT USING TDID TDNAME. SELECT SINGLE mandt tdobject tdname tdid tdspras INTO ...
- C# 虚拟键盘
[DllImport("user32.dll")] public static extern void keybd_event(byte bVk, byte bScan, uint ...