上一章节我们了解了如果访问文件系统。使用到了 fs 和 path 模块的部分功能,下面我们详细了解这两个模块可以实现的功能。

fs module

通过以上几个使用场景可以看到 fs 模块提供了很多有用的功能来对 file system 进行访问和交互。并且他是集成在 node.js core 中的,并不需要手动安装:

const fs = require('fs')

通过以上方式引入 fs 模块后,我们就可以使用它的各种功能了。包括:

  • fs.access(): 检查文件是否存在以及 node.js 是否有权限访问
  • fs.appendFile(): 给一个文件附加数据,如果文件不存在则会创建它
  • fs.chmod(): 修改文件的权限
  • fs.chown(): 修改文件的 owner 和 group 设置
  • fs.close(): 关闭已经打开的文件的 descriptor
  • fs.copyFile(): 复制一个文件
  • fs.createReadStream(): 创建一个可读的文件 stream
  • fs.createWriteStream(): 创建一个可写的文件 stream
  • fs.link(): 创建一个文件的硬链接
  • fs.mkdir(): 新建文件夹
  • fs.mkdtemp(): 创建一个临时文件夹
  • fs.open(): 打开一个文件的 descriptor,可定义打开编码类型
  • fs.readdir(): 读取一个目录下的内容
  • fs.readFile(): 读取一个文件的内容
  • fs.readlink(): 读取一个软连接的值
  • fs.realpath(): resolve 查询一个相对路径文件的绝对路径
  • fs.rename(): 重命名文件或文件夹
  • fs.rmdir(): 删除一个文件夹
  • fs.stat(): 返回一个文件的状态信息
  • fs.symlink(): 创建一个文件的软链接
  • fs.truncate(): 将一个文件分割成指定长度大小
  • fs.unlink(): 删除一个文件或一个软链接
  • fs.unwatchFile(): 停止监测对一个文件的修改
  • fs.utimes(): 修改一个文件的时间戳
  • fs.watchFile(): 开始监测对一个文件的修改
  • fs.writeFile(): 对一个文件写入数据

fs 模块的一个特性是它的以上所有 method 默认都是 asynchronous 异步的,给 method 后加上 Sync 就可以使用同步模式,例如:

  • fs.rename() -> fs.renameSync()
  • fs.write() -> fs.writeSync()

同步模式下通过使用 try/catch 块来处理 error 情况。同步模式下程序会在处理文件过程中出现进程阻塞直到处理完成,在编程中可以根据需要灵活运用。

path module

path 模块也提供了很多实用的功能来访问文件系统以及交互。同样的它也是集成在 node.js core 中而不需要单独安装。

const path = require('path')

通过 path.sep 可以获取当前系统的 path separator 路径分隔符:\ on Windows, and / on Linux/macOS。
通过 path.delimiter 可以获取当前系统的 path delimiter 路径定界符:; on Windows, and : on Linux / macOS。

例如在 Linux 下:

console.log(process.env.PATH);
// Prints: '/usr/bin:/bin:/usr/sbin:/sbin:/usr/local/bin'

process.env.PATH.split(path.delimiter);
// Returns: ['/usr/bin', '/bin', '/usr/sbin', '/sbin', '/usr/local/bin']

在 Windows 下:

console.log(process.env.PATH);
// Prints: 'C:\Windows\system32;C:\Windows;C:\Program Files\node\'

process.env.PATH.split(path.delimiter);
// Returns ['C:\\Windows\\system32', 'C:\\Windows', 'C:\\Program Files\\node\\']

下面是 path 的常用 method 介绍。

path.basename()

返回路径上的最后一部分,通过第二个参数可以过滤掉扩展名:

console.log(path.basename('/home/marco/dir'))
console.log(path.basename('/home/marco/file.txt'))
console.log(path.basename('/home/marco/file.txt', '.txt'))

//output:
dir
file.txt
file

path.dirname()

返回路径上的文件夹部分:

console.log(path.dirname('/home/marco/file'))

//output:
/home/marco

path.extname()

返回文件的扩展名:

console.log(path.extname('/home/marco/file.txt'))

//output:
.txt

path.isAbsolute()

返回路径是否是绝对路径:

console.log(path.isAbsolute('/home/marco'))
console.log(path.isAbsolute('./marco'))

//output:
true
false

path.join()

将多个部分合并为一个路径:

const name = 'marco';
console.log(path.join('/home/' + name + '/file'))

//output:
/home/marco/file

path.normalize()

将一个包含相对标记符的路径转换为常规绝对路径:

console.log(path.normalize('/home/marco/../test'))

//output:
/home/test

path.parse()

将路径拆分为一个 object,包含下面的 properties:

  • root: 根目录
  • dir: 从根目录开始的文件夹部分
  • base: 文件名和扩展名
  • name: 文件名不包含扩展名
  • ext: 扩展名
console.log(path.parse('/home/marco/test/file.txt'))

//output:
{
  root: '/',
  dir: '/home/marco/test',
  base: 'file.txt',
  ext: '.txt',
  name: 'file'
}

path.relative()

需要传入两个路径作为参数,第一个路径作为 base 基础路径,返回第二个路径相对于第一个路径的相对路径:

console.log(path.relative('/home/marco', '/home/marco/test/file.txt'))

//output:
test/file.txt

path.resolve()

计算一个相对路径的绝对路径,基于当前程序执行的路径:

console.log(path.resolve('file.txt'))

//output:
/mnt/hgfs/Development/node.js/filesystem/file.txt

也可以设置一个 base 路径,将会附加到相对路径中:

console.log(path.resolve('tmp/test', 'file.txt'))

//output:
/mnt/hgfs/Development/node.js/filesystem/tmp/test/file.txt

如果第一个 base 路径是绝对路径,则系统会认为这就是个绝对路径:

console.log(path.resolve('/tmp/test', 'file.txt'))

//output:
/tmp/test/file.txt

注意 path 模块对路径的处理不会判断这个路径是否真实存在,它只会按照指令处理路径这个字符串数据。

标签:无

你的评论