从官网进修Node.js FS模块要领速查

最新文档请检察堆栈 https://github.com/wangduandu…

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()被挪用,而且参数withFileTypestrue, 那末返回效果就是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. 参考

    原文作者:Carl
    原文地址: https://segmentfault.com/a/1190000017359113
    本文转自网络文章,转载此文章仅为分享知识,如有侵权,请联系博主进行删除。
点赞