目录
一、绝对路径和相对路径
1.绝对路径
①完整路径 e.g. d:\Nodejs学习笔记\path模块\Nodejs.txt
②__dirname
③__filename
2.相对路径
①./ 表示当前所在目录
②../ 表示父级(上一层)目录
③/ 表示根目录
二、文件操作路径问题
1.问题浮现
2.原因说明
3.解决方案
三、path路径模块
1.简介
2.导入
3.常用API
1)path.join()
2)path.basename()
3)path.extname()
4)path.resolve()
5)path.parse()
是指目录下的绝对位置,直接到达目标位置,通常是从盘符开始的路径。
node.js中内置了__dirname和__filename来动态获取文件绝对路径
const fs = require('fs')
const ContentPath = 'd:\Nodejs学习笔记\path模块\Nodejs.txt'
fs.readFile(ContentPath,'utf8', (err, data) => {
if (err) throw err;
console.log(data);
});
//读取当前目录下的Nodejs.txt 返回data
用来动态获取当前文件所属目录的绝对路径
console.log(__dirname); //输出 d:\Nodejs学习笔记\path模块
用来动态获取当前文件的绝对路径,包含当前文件
console.log(__filename); //输出 d:\Nodejs学习笔记\path模块\server.js
相对某个目录层级的路径,以下是三种表示相对路径的符号。
这里假设我的目录层级是d:\Nodejs学习笔记\path模块\Nodejs.txt
const fs = require('fs')
const ContentPath = './Nodejs.txt'
fs.readFile(ContentPath,'utf8', (err, data) => {
if (err) throw err;
console.log(data);
});
//读取当前目录下的Nodejs.txt 返回data
const fs =require('fs')
const ContentPath = '../Nodejs.txt'
fs.readFile(ContentPath,'utf8', (err, data) => {
if (err) throw err;
console.log(data);
});
//读取父级目录下的Nodejs.txt 返回err
const fs =require('fs')
const ContentPath = '/Nodejs.txt'
fs.readFile(ContentPath,'utf8', (err, data) => {
if (err) throw err;
console.log(data);
});
//读取根目录下的Nodejs.txt 返回err
让我们运行这段代码
const fs = require('fs')
const ContentPath = '/Nodejs.txt'
fs.readFile(ContentPath,'utf8', (err, data) => {
if (err) throw err;
console.log(data);
});
当我们在文件所处路径下运行node server.js时,可以成功输出文件内容
PS D:\Nodejs学习笔记\path模块> node server.js
Hello Node
读取文件成功!
但是,当我们在父级目录运行node path模块/server.js时,则报了error
PS D:\Nodejs学习笔记> node path模块/server.js
D:\Nodejs学习笔记\path模块\server.js:4
if (err) throw err;
^
[Error: ENOENT: no such file or directory, open 'D:\Nodejs学习笔记\Nodejs.txt'] {
errno: -4058,
code: 'ENOENT',
syscall: 'open',
path: 'D:\\Nodejs学习笔记\\Nodejs.txt'
}
这是由于当我们进行文件操作,使用相对路径时,此处的相对所指node命令执行所在的路径。
为了避免这个问题的产生,我们可以通过__dirname来获取动态路径,而nodejs给我们提供了path模块,可以更加优雅地对路径进行操作
path路径模块是 Node.js 官方提供的、用来处理路径的模块
我们要用到path路径模块,需要在使用前先导入path路径模块,以下是导入path路径模块的方法
const path = require('path')
①作用:
用来将多个路径片段拼接成一个完整的路径字符串
②用法:
path.join([...paths])
参数1:...paths 可缺省参数
③代码示例
path.join('a','b','../c','d','./e','f')
// 返回 a\c\d\e\f
注意:path拼接时会自动加上/,若遇到..或../会自动消除前面一个路径
①作用:
将路径字符串中的文件名解析出来
②用法:
path.basename(path[, suffix])
参数1:paths 必填参数
参数2:suffix 可缺省参数
③代码示例
path.basename('/path/path.html');
// 返回 path.html
path.basename('/path/path.html', '.html');
// 返回 path
①作用:
获取路径中的扩展名
②用法:
path.extname(path)
参数1:paths 必填参数
③代码示例
path.extname('index.html');
// 返回 '.html'
path.extname('index');
// 返回 ''
path.extname('.index');
// 返回 ''
path.extname('index.coffee.md');
// 返回 '.md'
①作用:
将每一个路径段做cd操作,转化为一个绝对路径,与path.join()不同的是,path.resolve会在传入的第一参数为非根路径时,返回内容会带上当前目录路径
②用法:
path.resolve([...paths])
参数1:...paths 必填参数
③代码示例
// 当前路径为 Nodejs学习笔记/path模块
path.join('path','join');
// path/join
path.resolve('path','join');
// Nodejs学习笔记/path模块/path/join
①作用:
将路径解析,返回一个包括一些重要路径属性的对象
②用法:
path.resolve([...paths])
参数1:...paths 可缺省参数
返回对象:
{
root
dir
base
ext
name
}
③代码示例
path.parse('/home/user/dir/file.txt');
// 返回
// { root: '/',
// dir: '/home/user/dir',
// base: 'file.txt',
// ext: '.txt',
// name: 'file' }