node.js-path 路径
前言
在fs文件系统中我们读文件和写文件时如果使用的是相对路径,那么就容易出现路径动态拼接错误的问题。
原因:在运行代码时,会以node命令所处的命令,动态拼接出被操作文件的完整路径。
实例
我们读取file目录下test.txt文件。我在E:\deyun\node\path
路径下执行这段代码,它可以读取出来,因为它此时拼接出来的路径为E:\deyun\node\path\file
。
//1.导入文件系统模块
const fs = require('fs')
//2.调用fs.readFile()方法读取文件
fs.readFile('./file/test.txt', 'utf8', (err, Datas)=>{
if(Datas){//读取成功就打印出文件中的信息
console.log(Datas);
}else{//如果文件读取失败,就打印出错误信息
console.log('文件读取失败。',err.message)
}
})
如果我在node目录下执行这段代码呢?
可以看到它打开的是E:\deyun\node\file\test.txt
,但是我在node下没有file目录,因此它会报错。
如何解决路径动态拼接错误的问题
1、提供一个完整的路径
我们将相对路径改为绝对路径,这样就可以保证我们在其他目录下执行代码出现路径错误的问题。
注意:再写绝对路径时我们使用\,第一个\代表转义符。
弊端:这种方式处理路径动态拼接错误的问题虽然可以解决,但是当这段代码换一个保存地址或者换一台电脑运行时,我们还需要重新写读取文件的地址,这样十分的麻烦,不利于维护。
//1.导入文件系统模块![在这里插入图片描述](https://img-blog.csdnimg.cn/2c1a153891ac41b4a071d1a58c7efafc.png?x-oss-process=image/watermark,type_d3F5LXplbmhlaQ,shadow_50,text_Q1NETiBA5YWt5Y-26I2Jfg==,size_19,color_FFFFFF,t_70,g_se,x_16)
const fs = require('fs')
//2.调用fs.readFile()方法读取文件
fs.readFile('E:\\deyun\\node\\path\\file\\test.txt', 'utf8', (err, Datas)=>{
if(Datas){//读取成功就打印出文件中的信息
console.log(Datas);
}else{//如果文件读取失败,就打印出错误信息
console.log('文件读取失败。',err.message)
}
})
2、使用__dirname全局变量
__dirname
当前模块的目录名。 这与 __filename 的 path.dirname() 相同。
我们打印一下这两个变量看看能打印出什么?
const path = require('path');
console.log(__dirname);
console.log(path.dirname(__filename));
我们在不同的路径下打印它都会打印出相同路径E:\deyun\node\path
,它代表的是当前执行的代码所在的路径,因此他会打印出相同的路径。
由于全局变量__dirname
代表当前模块的目录名,我们可以用__dirname
来拼接路径。
//1.导入文件系统模块
const fs = require('fs')
//2.调用fs.readFile()方法读取文件
fs.readFile(__dirname+'\\file\\test.txt', 'utf8', (err, Datas)=>{
if(Datas){//读取成功就打印出文件中的信息
console.log(Datas);
}else{//如果文件读取失败,就打印出错误信息
console.log('文件读取失败。',err.message)
}
})
通过__dirname
来拼接路径,我们在其他路径下也不会出现路径动态拼接错误的问题。
path路径模块
path 模块提供了用于处理文件和目录的路径的实用工具。 可以使用以下方式导入它:
const path = require('path');
path模块给我们提供了许多处理文件和目录的路径的方法。如路径动态拼接错误的问题就可以使用path中提示的方法解决。
路径拼接path.join()方法
path.join() 方法使用特定于平台的分隔符作为定界符将所有给定的 path 片段连接在一起,然后规范化生成的路径。
基本语法格式:
path.join([...paths])
...paths <string>
:可选参数,路径片段的序列。
返回值
: 返回一个字符串。
零长度的 path 片段被忽略。 如果连接的路径字符串是零长度字符串,则将返回 ‘.’,表示当前工作目录。
通过path方法解决路径拼接问题。
//1.导入文件系统模块
const fs = require('fs')
//导入path模块
const path = require('path');
//2.调用fs.readFile()方法读取文件
//使用path.join()方法拼接路径
fs.readFile(path.join(__dirname,'/file/test.txt'), 'utf8', (err, Datas)=>{
if(Datas){//读取成功就打印出文件中的信息
console.log(Datas);
}else{//如果文件读取失败,就打印出错误信息
console.log('文件读取失败。',err.message)
}
})
注意
在path.join()方法方法中它可以使用相对路径,./
代表的当前路径,../
它回到上一级目录。
const path = require('path');
console.log(path.join('./a','./b','../c','/d'))
在拼接的路径中有../c
那么它会回到a目录下,然后在拼接c。
获取文件的目录path.dirname()方法
path.dirname() 方法返回 path 的目录名, 尾随的目录分隔符被忽略。
基本语法格式:
path.dirname(path)
path:必选参数,类型为 <string>
。
返回值: 返回一个路径字符串。
实例
const path = require('path');
console.log(path.dirname('E:/deyun/node/path/5dirname'))
获取扩展名path.extname()方法
path.extname() 方法返回 path 的扩展名,即 path 的最后一部分中从最后一次出现的 .(句点)字符到字符串的结尾。
基本语法格式:
path.extname(path)
path
:必选参数,表示一个路径字符串。
返回值
: 返回一个字符串类型的扩展名。
实例
const path = require('path');
console.log(path.extname('6extname.js'));
console.log(path.extname('6extname.txt.js'));
console.log(path.extname('6extname'));
console.log(path.extname('6extname.'));
它只返回path最后一部分中最后一个.
之后的内容(包含.
),否则返回空字符串。
获取文件名的path.basename()方法
path.basename() 方法返回 path 的最后一部分, 尾随的目录分隔符被忽略。
基本语法格式:
path.basename(path[, ext])
path
:必选参数,表示一个路径字符串。
ext
:可选的文件扩展名
返回值
: 返回一个字符串类型的文件名。
实例
const path = require('path');
console.log(path.basename('E:/deyun/node/path/7basename.js'));
console.log(path.basename('E:/deyun/node/path/7basename.js', '.html'));
console.log(path.basename('E:/deyun/node/path/7basename.js', '.js'));
console.log(path.basename('E:/deyun/node/path/7basename.JS', '.js'));
如果扩展名错误
那么它依旧会返回path 的最后一部分。
Windows 通常以不区分大小写的方式处理文件名(包括文件扩展名),但此函数会区分大小写。 例如,E:/deyun/node/path/7basename.JS
和 E:/deyun/node/path/7basename.js
指的是同一个文件,但 basename 将扩展名视为区分大小写的字符串。