1. 概念

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

2. 代码演示

目录结构

app.js文件,使用node app.js 命令执行app.js文件

console.log(__dirname); //D:\code\frontend\nodeProject\testconsole.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,它都可以正常运行。

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

前端学习交流QQ群,群内学习讨论的氛围很好,大佬云集,期待您的加入:862748629 点击加入

__dirname和__filename相关推荐

  1. 关于 __dirname和__filename介绍以及使用场景

    在每个模块中除了 require ,exports 等模块相关 API之外,还有两个特殊的成员: __dirname:用来动态获取当前文件模块所属目录的绝对路径 __filename:用来动态获取当前 ...

  2. __dirname与__filename

    (1) __filename变量 node.js中,在任何模块文件内部,可以使用__filename变量获取当前模块文件的带有完整绝对路径的文件名. 在应用程序根目录下新建app.js文件,其中代码如 ...

  3. node中全局对象一 --- __dirname和__filename

    __dirname:全局变量,存储的是文件所在的文件目录 __filename:全局变量,存储的是文件名 如在webstorm下执行结果

  4. ESLint 配置说明

    ESLint 有什么用,为什么要使用? ESLint 是一套可自定义规则的JS代码检查与修复工具 目标是保存团队代码的一致性和避免错误并且修复错误.减少团队沟通成本 "no-alert&qu ...

  5. Nexus.js介绍:一个多线程的JavaScript运行库

    首先,如果你不熟悉这个项目,建议先阅读之前写的一系列文章.如果你不想阅读这些,不用担心.这里面也会涉及到那些内容. 现在,让我们开始吧. 去年,我开始实现Nexus.js,这是一个基于Webkit/J ...

  6. 前端代码规范(es6,eslint,vue)

    2019独角兽企业重金招聘Python工程师标准>>> 前端开发规范 一.HTML 1.语义化标签 HTML5 提供了很多语义化元素,更好地帮助描述内容.希望你能从这些丰富的标签库中 ...

  7. Eslint配置文件 `.eslintrc.js`

    2019独角兽企业重金招聘Python工程师标准>>> module.exports = {// 如果有多个目录有.eslintrc.js配置文件,并且配置了此项,则不会再父级目录中 ...

  8. 如何使用Node.js获取当前脚本的路径?

    我如何获得Node.js中脚本的路径? 我知道有process.cwd ,但这只是指调用脚本的目录,而不是脚本本身. 例如,假设我在/home/kyle/运行以下命令: node /home/kyle ...

  9. vue-cli eslint 规则

    "no-alert": 0,//禁止使用alert confirm prompt "no-array-constructor": 2,//禁止使用数组构造器 & ...

最新文章

  1. 中医点滴 1 --- 冬季外感喉咙痛 寒性荨麻疹
  2. linux iptables规则组成及用法
  3. python爬虫软件-8个最高效的Python爬虫框架,你用过几个?
  4. SVN中update to revision与revert to revision的区别
  5. python演示验证图像叠加过程_Python叠加矩形框图层2种方法及效果代码实例
  6. js怎么实现对html代码加密解密,javascript脚本加密解密及HTML转JS
  7. 万字详解Lambda、Stream和日期
  8. hdu4848 求到达每一个点总时间最短(sum[d[i]])。
  9. Apollo灰度发布
  10. Hexo NexT主题添加点击爱心效果
  11. hadoop2.9.2安装hadoop_pid_dir_Hadoop3.2 +Spark3.0全分布式安装
  12. 09年网络工程师考试大纲
  13. Android fastboot下载模式或reboot流程解析
  14. 铁打的春晚,流水的流量
  15. Windows如何设置夜间模式(护眼模式)超简单
  16. I Sold Out for the Cash - 2022/8/10
  17. 5款网络故障排除软件
  18. 周灏:金融大数据量化信用
  19. Unity学习场景、模型和粒子资源包,总有一款你能用到,亲测可使用,第一波来袭
  20. 线条的样式solid dotted dashed

热门文章

  1. html z-index 设置无效,css z-index属性不起作用的原因及解决方法
  2. 预防死锁,检测死锁,避免死锁,解除死锁....
  3. CSS 属性 columns
  4. 字符串的输入输出及字符串函数
  5. appium使用简记
  6. 敏捷转型(2)——企业文化
  7. setCapture和releaseCapture的小应用
  8. wald检验_Stata: 面板 Granger 因果检验
  9. python 工程进度计划_从零开始的项目实战(7)——项目进度述职报告
  10. linux 去掉终端控制符,Linux终端显示控制字符