目录

一、绝对路径和相对路径

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()


一、绝对路径和相对路径

1.绝对路径

是指目录下的绝对位置,直接到达目标位置,通常是从盘符开始的路径。

node.js中内置了__dirname和__filename来动态获取文件绝对路径

①完整路径 e.g. d:\Nodejs学习笔记\path模块\Nodejs.txt

const fs = require('fs')
const ContentPath = 'd:\Nodejs学习笔记\path模块\Nodejs.txt'
fs.readFile(ContentPath,'utf8', (err, data) => {
    if (err) throw err;
    console.log(data);
});
//读取当前目录<path模块>下的Nodejs.txt 返回data

②__dirname

用来动态获取当前文件所属目录的绝对路径

console.log(__dirname); //输出 d:\Nodejs学习笔记\path模块

③__filename

用来动态获取当前文件的绝对路径,包含当前文件

console.log(__filename); //输出 d:\Nodejs学习笔记\path模块\server.js

2.相对路径

相对某个目录层级的路径,以下是三种表示相对路径的符号。

这里假设我的目录层级是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);
});
//读取当前目录<path模块>下的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学习笔记>下的Nodejs.txt 返回err

③/ 表示根目录

const fs =require('fs')
const ContentPath = '/Nodejs.txt'
fs.readFile(ContentPath,'utf8', (err, data) => {
    if (err) throw err;
    console.log(data);
});
//读取根目录<d:>下的Nodejs.txt 返回err

二、文件操作路径问题

1.问题浮现

让我们运行这段代码

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'
}

2.原因说明

这是由于当我们进行文件操作,使用相对路径时,此处的相对所指node命令执行所在的路径。

3.解决方案

为了避免这个问题的产生,我们可以通过__dirname来获取动态路径,而nodejs给我们提供了path模块,可以更加优雅地对路径进行操作

三、path路径模块

1.简介

path路径模块是 Node.js 官方提供的、用来处理路径的模块

2.导入

我们要用到path路径模块,需要在使用前先导入path路径模块,以下是导入path路径模块的方法

const path = require('path')

3.常用API

1)path.join()

①作用:

用来将多个路径片段拼接成一个完整的路径字符串

②用法:

path.join([...paths])

参数1:...paths 可缺省参数 <string>

③代码示例

path.join('a','b','../c','d','./e','f')
// 返回 a\c\d\e\f

注意:path拼接时会自动加上/,若遇到..或../会自动消除前面一个路径

2)path.basename()

①作用:

将路径字符串中的文件名解析出来

②用法:

path.basename(path[, suffix])

参数1:paths 必填参数 <string>

参数2:suffix 可缺省参数 <string>

③代码示例

path.basename('/path/path.html');
// 返回 path.html

path.basename('/path/path.html', '.html');
// 返回 path

3)path.extname()

①作用:

获取路径中的扩展名

②用法:

path.extname(path)

参数1:paths 必填参数 <string>

③代码示例

path.extname('index.html');
// 返回 '.html'
path.extname('index');
// 返回 ''
path.extname('.index');
// 返回 ''
path.extname('index.coffee.md');
// 返回 '.md'

4)path.resolve()

①作用:

将每一个路径段做cd操作,转化为一个绝对路径,与path.join()不同的是,path.resolve会在传入的第一参数为非根路径时,返回内容会带上当前目录路径

②用法:

path.resolve([...paths])

参数1:...paths 必填参数 <string>

③代码示例

// 当前路径为 Nodejs学习笔记/path模块
path.join('path','join');
// path/join
path.resolve('path','join');
// Nodejs学习笔记/path模块/path/join

5)path.parse()

①作用:

将路径解析,返回一个包括一些重要路径属性的对象

②用法:

path.resolve([...paths])

参数1:...paths 可缺省参数 <string>

返回对象:<Object>

{

root <string>

dir <string>

base <string>

ext <string>

name <string>

}

③代码示例

path.parse('/home/user/dir/file.txt');
// 返回
// { root: '/',
//   dir: '/home/user/dir',
//   base: 'file.txt',
//   ext: '.txt',
//   name: 'file' }