Node.js学习笔记(四) fs、os、path模块

简介: Node.js学习笔记(四) fs、os、path模块

前言


这篇文章我们将会学习 Node 中的一些内置模块,分别是 fs、os、path


正文


1、fs 模块


fs 模块提供类似 UNIX 标准的 文件操作 API,其中所有的方法均有 异步 和 同步 版本


在一般情况下,异步方法性能更高,所以下面只会介绍常用的异步方法


(1)通用操作


① 获取信息:stat(path, callback)


  • path:路径
  • callback:回调函数,接收两个参数,分别是 Error 对象和 fs.stats 对象,stats 对象常用方法如下:


  • isFile():如果是文件返回 true,否则返回 false
  • isDirectory():如果是目录返回 true,否则返回 false
  • isBlockDevice():如果是块设备返回 true,否则返回 false
  • isCharacterDevice():如果是字符设备返回 true,否则返回 false
  • isSymbolicLink():如果是软链接返回 true,否则返回 false
  • isFIFO():如果是 FIFO 返回true,否则返回 false
  • isSocket():如果是 Socket 返回 true,否则返回 false


const fs = require('fs')
fs.stat('input.txt', function (err, stats) {
  if (err) {
        return console.error(err)
    }
    // 检测文件类型
    console.log(stats.isFile())
    console.log(stats.isDirectory())
})


(2)文件操作


① 打开文件:open(path, flags[, mode], callback)


  • path:文件路径
  • flags:文件打开方式,它的取值如下:

r:以读取模式打开文件,如果文件不存在则抛出异常

r+:以读写模式打开文件,如果文件不存在则抛出异常

rs:以同步的方式读取文件

rs+:以同步的方式读取和写入文件

w:以写入模式打开文件,如果文件不存在则创建文件

wx:类似于 w,但是如果文件存在,那么文件写入失败

w+:以读写模式打开文件,如果文件不存在则创建文件

wx+:类似 w+,但是如果文件存在,那么文件读写失败

a:以追加模式打开文件,如果文件不存在则创建文件

ax:类似 a, 但是如果文件存在,那么文件追加失败

a+:以读取追加模式打开文件,如果文件不存在则创建文件

ax+:类似 a+,但是如果文件存在,那么文件读取追加失败


  • mode:文件权限,创建文件的默认权限为 0666
  • callback:回调函数,接收两个参数,分别是错误信息和文件描述符


② 关闭文件:close(fd, callback)


  • fd:文件描述符
  • callback:回调函数,没有参数
const fs = require('fs')
// 打开文件
fs.open('file.txt', 'r+', function(err, fd) {
    if (err) {
      return console.error(err)
    }
    console.log('文件打开成功')
    // 关闭文件
    fs.close(fd, function(err) {
        if (err) {
          console.error(err)
        } 
        console.log('文件关闭成功')
    })
})


③ 写入文件:writeFile(file, data[, options], callback)


  • file:文件路径或文件描述符
  • data:要写入文件的数据,可以是 StringBuffer 对象
  • options:配置对象,包含三个属性,分别如下:


encoding:文件编码,默认为 utf8

mode:文件权限,默认为 0666

flag:文件打开方式,默认为 w


  • callback:回调函数,接收一个参数,就是错误信息
const fs = require('fs')
var data = 'Hello World'
// 写入文件
fs.writeFile('file.txt', data, function(err) {
    if (err) {
      return console.error(err)
    }
    console.log('文件写入成功')
})


④ 读取文件:read(fd, buffer, offset, length, position, callback)


  • fd:文件描述符
  • buffer:数据写入的缓冲区
  • offset:缓冲区的写入偏移量
  • length:文件读取的字节数
  • position:文件读取的起始位置,如果为 null,则会从当前文件指针的位置读取
  • callback:回调函数,接收三个参数,分别是错误信息、读取字节数和缓冲区对象
const fs = require('fs')
var buf = new Buffer.alloc(1024)
// 打开文件
fs.open('file.txt', 'r+', function(err, fd) {
    if (err) {
        return console.error(err)
    }
    // 读取文件
    fs.read(fd, buf, 0, buf.length, 0, function(err, bytes) {
        if (err) {
          console.error(err)
        }
        if (bytes > 0) {
            var data = buf.slice(0, bytes).toString()
          console.log(data)
        }
    })
})


⑤ 截取文件:ftruncate(fd, len, callback)

  • fd:文件描述符
  • len:截取长度
  • callback:回调函数,没有参数
const fs = require('fs')
var buf = new Buffer.alloc(1024)
// 打开文件
fs.open('file.txt', 'r+', function(err, fd) {
    if (err) {
      return console.error(err);
    }
    // 截取文件
    fs.ftruncate(fd, 10, function(err) {
        if (err){
          console.error(err)
        }
        console.log('文件截取成功')
    })
})


⑥ 删除文件:unlink(path, callback)

  • path:文件路径
  • callback:回调函数,没有参数


(3)目录操作


① 创建目录:mkdir(path[, options], callback)


  • path:文件路径
  • options:配置信息,它的取值如下:

recursive:是否以递归的方式创建目录,默认为 false

mode:目录权限,默认为 0777


  • callback:回调函数,没有参数


② 删除目录:rmdir(path, callback)


  • path:文件路径
  • callback:回调函数,没有参数


③ 读取目录:readdir(path, callback)


  • path:文件路径
  • callback:回调函数,接收两个参数,分别是错误信息和目录下的文件数组
const fs = require('fs')
// 读取目录
fs.readdir('./', function(err, files) {
    if (err) {
      return console.error(err);
    }
    files.forEach(function (file) {
      console.log(file)
    })
})



(4)管道 Stream


Stream 是一个 抽象接口,Node 中很多对象都实现了这个接口


① 管道类型


Stream 对象共有四种类型,分别如下:

  • Readable:可读
  • Writable:可写
  • Duplex:可读可写
  • Transform:操作被写入数据,然后读出结果


② 管道事件


所有的 Stream 对象都是 EventEmitter 的实例,常用的绑定事件如下:

  • data:当有数据可读时触发
  • end:当没有数据可读时触发
  • finish:当所有数据都被写入时触发
  • error:在接收和写入过程中发生错误时触发


③ 读取 Stream


const fs = require('fs')
var data = ''
// 创建可读流
var readerStream = fs.createReadStream('input.txt')
// 设置编码
readerStream.setEncoding('UTF8')
// 处理流事件(data、end、error)
readerStream.on('data', function(chunk) {
   data += chunk
})
readerStream.on('end', function() {
   console.log(data)
})
readerStream.on('error', function(err) {
   console.log(err.stack)
})


④ 写入 Stream


const fs = require('fs')
var data = 'Hello World'
// 创建可写流
var writerStream = fs.createWriteStream('output.txt')
// 写入数据
writerStream.write(data, 'UTF8')
// 标记文件末尾
writerStream.end()
// 处理流事件(finish、error)
writerStream.on('finish', function() {
    console.log('Finished')
})
writerStream.on('error', function(err){
   console.log(err.stack)
})


⑤ 管道流


管道流用于从一个流传递数据到另一个流

const fs = require('fs')
// 创建可读流
var readerStream = fs.createReadStream('input.txt')
// 创建可写流
var writerStream = fs.createWriteStream('output.txt')
// 读取 input.txt 文件内容,并将内容写入 output.txt 文件
readerStream.pipe(writerStream)


⑥ 链式流


链式流一般用于管道,可以理解成多个管道相连

const fs = require('fs')
const zlib = require('zlib')
// 压缩 input.txt 文件为 input.txt.gz
fs.createReadStream('input.txt')
  .pipe(zlib.createGzip())
  .pipe(fs.createWriteStream('input.txt.gz'))
// 解压 input.txt.gz 文件为 input.txt
fs.createReadStream('input.txt.gz')
  .pipe(zlib.createGunzip())
  .pipe(fs.createWriteStream('input.txt'))


2、os 模块


os 模块提供 基本的系统操作函数,常用的属性和方法如下:


  • type():返回操作系统名
  • platform():返回编译时的操作系统名
  • hostname():返回操作系统主机名
  • cpus():返回一个对象数组,包含每个 CPU 的信息
  • arch():返回 CPU 架构,可能是 x64、arm 或 ia32
  • endianness():返回 CPU 字节序,可能是 BE 或 LE
  • totalmem():返回操作系统总内存量,单位为字节
  • freemem():返回操作系统空闲内存量,单位为字节
  • networkInterfaces():返回网络接口列表
const os = require('os')
console.log(os.type())
console.log(os.platform())
console.log(os.hostname())
console.log(os.cpus())
console.log(os.arch())
console.log(os.endianness())
console.log(os.totalmem())
console.log(os.freemem())
console.log(os.networkInterfaces())

详细内容请看官方文档:https://nodejs.org/api/os.html


3、path 模块


path 模块提供 处理文件路径的工具,常用的属性和方法如下:


  • sep:平台的文件路径分隔符,可以是 \\ 或 /
  • delimiter:平台的分隔符,可以是 ; 或 :
  • posix:以 posix 兼容的方式提供 path 方法
  • win32:以 win32 兼容的方式提供 path 方法
  • normalize(path):规范化路径
  • dirname(path):返回路径中的文件夹名称
  • basename(path):返回路径中的文件名称
  • extname(path):返回路径中的文件后缀名
  • parse(pathString):从字符串中返回路径对象
  • format(pathObject):从对象中返回路径字符串
  • isAbsolute(path):判断是否为绝对路径
  • relative(from, to):基于 from 将 to 从绝对路径转换为相对路径
  • path.join([path1],[path2] ... [pathN]):连接路径
const path = require('path')
const home = 'D:\\Blog\\source\\_posts'
console.log(path.sep)
console.log(path.delimiter)
console.log(path.posix)
console.log(path.win32)
console.log(path.dirname(home))
console.log(path.basename(home))
console.log(path.extname(home))
console.log(path.isAbsolute(home))
console.log(path.relative('D:\\Blog\\public', home))
console.log(path.join(home, 'Node.js学习笔记(四) fs、os、path模块'))

详细内容请看官方文档:https://nodejs.org/api/path.html


文章知识点与官方知识档案匹配,可进一步学习相关知识

目录
相关文章
|
5月前
|
JavaScript 前端开发 API
Vue学习笔记3:对比纯JavaScript和Vue实现数据更新的实时视图显示
Vue学习笔记3:对比纯JavaScript和Vue实现数据更新的实时视图显示
|
5月前
|
Web App开发 前端开发 JavaScript
HTML/CSS/JS学习笔记 Day3(HTML--网页标签 下)
HTML/CSS/JS学习笔记 Day3(HTML--网页标签 下)
|
4月前
|
JavaScript 前端开发
【干货分享】JavaScript学习笔记分享
【干货分享】JavaScript学习笔记分享
73 0
|
6月前
|
JavaScript Linux Windows
【应用服务 App Service】NodeJS +Egg 发布到App Service时遇见 [ERR_SYSTEM_ERROR]: A system error occurred:uv_os_get_passwd returned ENOENT(no such file or directory)
【应用服务 App Service】NodeJS +Egg 发布到App Service时遇见 [ERR_SYSTEM_ERROR]: A system error occurred:uv_os_get_passwd returned ENOENT(no such file or directory)
137 0
|
6月前
|
存储 JavaScript 前端开发
nodejs os模块
nodejs os模块
60 0
|
7月前
|
JavaScript
【Node.js基础02】fs、path模块
【7月更文挑战第17天】
40 0
|
7月前
|
JavaScript Java 测试技术
基于springboot+vue.js+uniapp的云的学习笔记系统附带文章源码部署视频讲解等
基于springboot+vue.js+uniapp的云的学习笔记系统附带文章源码部署视频讲解等
59 0
|
8月前
|
JavaScript Linux 开发者
【Node.js】从基础到精通(二)—— Path 模块全解析
【Node.js】从基础到精通(二)—— Path 模块全解析
75 0
|
8月前
|
JavaScript 安全 前端开发
【Node.js】从入门到精通(一)—— fs 模块全解析
【Node.js】从入门到精通(一)—— fs 模块全解析
156 0
|
定位技术
arcgisapi for javascript4.0学习笔记4.0新特性
版权声明:本文为博主原创文章,未经博主允许不得转载。 https://blog.csdn.net/gisdoer/article/details/51842547 arcgisapi for javascript4.
795 0

热门文章

最新文章

  • 1
    【02】仿站技术之python技术,看完学会再也不用去购买收费工具了-本次找了小影-感觉页面很好看-本次是爬取vue需要用到Puppeteer库用node.js扒一个app下载落地页-包括安卓android下载(简单)-ios苹果plist下载(稍微麻烦一丢丢)-优雅草卓伊凡
    23
  • 2
    Node.js 中实现多任务下载的并发控制策略
    32
  • 3
    【2025优雅草开源计划进行中01】-针对web前端开发初学者使用-优雅草科技官网-纯静态页面html+css+JavaScript可直接下载使用-开源-首页为优雅草吴银满工程师原创-优雅草卓伊凡发布
    25
  • 4
    【JavaScript】深入理解 let、var 和 const
    48
  • 5
    【04】Java+若依+vue.js技术栈实现钱包积分管理系统项目-若依框架二次开发准备工作-以及建立初步后端目录菜单列-优雅草卓伊凡商业项目实战
    44
  • 6
    【03】Java+若依+vue.js技术栈实现钱包积分管理系统项目-若依框架搭建-服务端-后台管理-整体搭建-优雅草卓伊凡商业项目实战
    53
  • 7
    【02】Java+若依+vue.js技术栈实现钱包积分管理系统项目-商业级电玩城积分系统商业项目实战-ui设计图figmaUI设计准备-figma汉化插件-mysql数据库设计-优雅草卓伊凡商业项目实战
    55
  • 8
    如何通过pm2以cluster模式多进程部署next.js(包括docker下的部署)
    71
  • 9
    【01】Java+若依+vue.js技术栈实现钱包积分管理系统项目-商业级电玩城积分系统商业项目实战-需求改为思维导图-设计数据库-确定基础架构和设计-优雅草卓伊凡商业项目实战
    55
  • 10
    JavaWeb JavaScript ③ JS的流程控制和函数
    62