node.js 入门教程之七 -- fs 和 path 模块
上一章节我们了解了如果访问文件系统。使用到了 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 模块对路径的处理不会判断这个路径是否真实存在,它只会按照指令处理路径这个字符串数据。
标签:无