__dirname和__filename

1. 概念

  • __dirname 可以用来动态获取当前文件所属目录的绝对路径
  • __filename 可以用来动态获取当前文件的绝对路径,包含当前文件
  • __dirname__filename 是不受执行node命令所属路径影响的

2. 代码演示

目录结构
在这里插入图片描述
app.js文件,使用node app.js 命令执行app.js文件

console.log(__dirname); //D:\code\frontend\nodeProject\test

console.log(__filename); //D:\code\frontend\nodeProject\test\app.js

foo文件夹下的 a.txt 文件中只有一个字符串hello aaa

foo文件夹下的 index.js 文件:

let fs = require('fs');
let path = require('path');

//读取 a.txt 文件,注意此处使用的是相对路径 './a.txt'
fs.readFile('./a.txt','utf-8',function (err,data) {
    
    
  if (err) {
    
    
    throw err
  }
  console.log(data);
})

2.1 测试

  1. 如果我们通过终端在 foo 文件目录中执行 foo 文件夹下的 index.js 文件,那么上边的代码是没有任何问题的。
    在这里插入图片描述
  2. 但是,如果我们在 test 目录下通过 node foo/index.js 命令执行 foo 文件夹下的 index.js 文件,上边的代码就会报错。
    报错信息显示在test文件夹下找不到 a.txt 文件。
    在这里插入图片描述

2.2 背后原因

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

也就是说上边的代码,当我们在 test 目录下使用 node 命令去执行 foo 文件夹下的 index.js 文件(我们在该文件中使用了相对路径./a.txt), 那么就会去 test 目录下寻找 a.txt 文件,而不是去 foo 目录中寻找。

  • 注意:这不是错误,Node就是这样设计的,文件操作中,相对路径设计的就是相对于执行node命令所处的路径
  • 所以文件操作中,使用相对路径是不可靠的
  • 为了解决这个问题,只需要把相对路径变为 动态的绝对路径__dirname 此时就派上了用场

2.3 改进代码

let fs = require('fs');
let path = require('path');//引入path模块

//使用 path 的 join 方法将两个路径拼接起来
fs.readFile(path.join(__dirname,'./a.txt'),'utf-8',function (err,data) {
    
    
  if (err) {
    
    
    throw err
  }
  console.log(data);
})

此时不管我们在那个目录下执行index.js,它都可以正常运行。

注意: 当我们导入自己编写的模块时,使用了相对路径,那么该相对于谁就相对于谁,这里的路径标识和文件操作过程中的路径没有关系。

猜你喜欢

转载自blog.csdn.net/weixin_43974265/article/details/112441287