Node.js FS模块方法速查

更新日期: 2018-12-13 阅读: 3.9k 标签: node

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 or Buffers
  • 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



本文内容仅供个人学习、研究或参考使用,不构成任何形式的决策建议、专业指导或法律依据。未经授权,禁止任何单位或个人以商业售卖、虚假宣传、侵权传播等非学习研究目的使用本文内容。如需分享或转载,请保留原文来源信息,不得篡改、删减内容或侵犯相关权益。感谢您的理解与支持!

链接: https://fly63.com/article/detial/1570

相关推荐

怎么卸载nodejs?

Node.js是一个Javascript运行环境,可以使Javascript这类脚本语言编写出来的代码运行速度获得极大提升,那么安装后该如何卸载呢?下面本篇文章就来给大家介绍一下Windows平台下卸载node.js的方法,希望对大家有所帮助。

happypack提升项目构建速度

运行在 Node.js 之上的 Webpack 是单线程模型的,也就是说 Webpack 需要处理的任务需要一件件挨着做,不能多个事情一起做。happypack把任务分解给多个子进程去并发的执行,子进程处理完后再把结果发送给主进程。

nodejs 异步转同步

nodej项目在微信环境开发,nodejs的异步特效,会导致请求没有完成就执行下面的代码,出现错误。经过多方查找,可以使用async模块来异步转同步,只有前一个function执行callback,下一个才会执行。

node.js反向代理的实现

在实际工程开发中,会有前后端分离的需求。使用node.js反向代理的目的:实现前后端分离,前端减少路径请求的所需的路由文件;通过http-proxy-middleware中间件、Http Proxy 模块这2种方式实现node.js的反向代理

Ubuntu 上 Node.js 安装和卸载

Ubuntu 安装 Node.Js:执行检查可更新的软件,先用普通的apt工具安装低版本的node,然后再升级最新。更换淘宝的镜像,这个是必须的,用过的node的人都知道。安装更新版本的工具N

nodejs 文本逐行读写功能的实现

利用nodejs实现:逐行读写(从一个文件逐行复制到另外一个文件);逐行读取、处理和写入(读取一行,处理后,写入另一个文件)1.所需要的模块: fs,os,readline。功能的实现:readWriteFileByLine.js,功能的调用:index.js

使用pkg打包Node.js应用的方法步骤

Node.js应用不需要经过编译过程,可以直接把源代码拷贝到部署机上执行,确实比C++、Java这类编译型应用部署方便。然而,Node.js应用执行需要有运行环境,意味着你需要先在部署机器上安装Node.js

query和params在前后端中的区别

最近在学node,试着做一个前后端都有的项目,然后就遇到了query和parmas这俩兄弟,你说他们俩长得也不像吧,可这用法实在是太类似了,专门写篇文章来区分这哥俩,分别会从vue路由和Node接收两个角度讲

用node.js开发一个可交互的命令行应用

在这个教程中,我们会开发一个命令行应用,它可以接收一个 CSV 格式的用户信息文件,教程的内容大纲:“Hello,World”,处理命令行参数,运行时的用户输入,异步网络会话,美化控制台的输出,封装成 shell 命令,JavaScript 之外

Node.js 应用:Koa2 使用 JWT 进行鉴权

在前后端分离的开发中,通过 Restful API 进行数据交互时,如果没有对 API 进行保护,那么别人就可以很容易地获取并调用这些 API 进行操作。那么服务器端要如何进行鉴权呢?

点击更多...

内容以共享、参考、研究为目的,不存在任何商业目的。其版权属原作者所有,如有侵权或违规,请与小编联系!情况属实本人将予以删除!