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

article/2025/11/6 9:05:50

在每个模块中除了 require ,exports 等模块相关 API之外,还有两个特殊的成员:

  • __dirname:用来动态获取当前文件模块所属目录的绝对路径
  • __filename:用来动态获取当前文件的绝对路径

示例

在这里插入图片描述
在这里插入图片描述

现有如下一个问题,如何解决?

文件结构如下:

在这里插入图片描述
foo/index.js,进行读取同目录下的a.txt文件:
在这里插入图片描述

02-文件路径的问题.js 引入了 foo文件夹下的 index.js:
在这里插入图片描述
总结:02-文件路径的问题.js 引入了 foo文件夹下的 index.js,index.js 会去读取同文件夹下的 a.txt。

问题描述:我现在想执行 02-文件路径的问题.js ,但我执行这个文件的时候,路径是 C:\Users\CHY\Desktop\前端学习\05-node.js\day 6,这个路径也就是执行node命令所处的终端路径

  • 可以看出:foo/index.js 的readFile的第一个参数'./a.txt',会去day 6下寻找是否有这个文件
  • 最后一定会报错,报错如下:

在这里插入图片描述
所以:在文件操作中,使用相对路径是不可靠的,因为在Node中 文件操作路径被设计为相对于执行node命令所处的路径。这不是bug,人家这样设计,是有使用场景的。

解决:

解决问题的核心:只需要把相对路径,变成 绝对路径

foo/index.js:

在这里插入图片描述
在终端运行多种情况:

在这里插入图片描述

  • 这个办法虽然能解决问题,但不可以这样用。
  • 原因:因为这是写死的。万一要把这个项目给别人的话,就是不可行的

使用动态的绝对路径

在这里我们可以使用 __dirname

如下:

fs.readFile(__dirname + '/a.txt', 'utf8', function(err, data) {if (err) {throw err}console.log(data);
})

或者如下(推荐使用!!!):

var fs = require('fs')
var path = require('path')fs.readFile(path.join(__dirname, 'a.txt'), 'utf8', function(err, data) {if (err) {throw err}console.log(data);
})
  • __dirname, 和 __filename 是不受执行node命令所属路径影响的
  • 并且在拼接路径的过程中,为了避免手动拼接带来的一些低级错误,所以多推荐使用path.join()
  • 为了尽量避免上述问题,以后在文件操作中使用的相对路径都统一转换为动态的绝对路径

补充:模块中的路径标识 和 这里的路径没关系,不受 执行node 命令所处路径 影响(相对于当前文件模块)


http://chatgpt.dhexx.cn/article/c8oDVb0T.shtml

相关文章

AQS的一个cancleAcquire方法,能看到Doug Lea大神的多少细节?

目录 写在前面一、调用时机二、源码分析2.1 node为tail2.2 node为中间节点2.2.1 N2的取消逻辑2.2.2 N3继N2之后取消 2.3 node是头结点的后继节点2.4 并发取消的场景 三、思考与总结 写在前面 第一次读AQS源码时,对cancleAcquire的理解比较肤浅(停留在方…

leaq c 汇编语言,汇编语言lea指令使用方法解析

这篇文章主要介绍了汇编语言lea指令使用方法解析,文中通过示例代码介绍的非常详细,对大家的学习或者工作具有一定的参考学习价值,需要的朋友可以参考下 lea指令变种(按大小分类): leaw #2个字节 leal #4个字节 leaq #8个字节 lea的用法: leaq a(b, c, d), %rax 首先…

微机原理——指令系统——传送类指令(MOV、LEA、LDS、LES、LAHF、SAHF、XCHG、XLAT、PUSH、POP、PUSHF、POPF)

博主联系方式: QQ:1540984562 QQ交流群:892023501 群里会有往届的smarters和电赛选手,群里也会不时分享一些有用的资料,有问题可以在群里多问问。 【没事儿可以到我主页看看】https://blog.csdn.net/qq_42604176 传送类指令 1&am…

汇编指令lea 和 mov 区别

刚开始学汇编都会接触到指令lea 和mov,但是这两个指令用法看起来很像,会经常误以为两者其实没有很大区别,甚至会误认为两者就是相等的,笔者本人也是很迷,而且书上对lea的讲解又十分有限,但是通过不懈的知识…

x86 LEA 指令

友链 参考链接: https://stackoverflow.com/questions/1658294/whats-the-purpose-of-the-lea-instruction 在使用OllyDBG反汇编一个exe的时候,看到了这样的代码 这部分对应的源代码应该是: return 2*xy;明明是一个乘法和加法运算&#x…

数据传送类指令(PUSH,POP,LEA)

目录 数据传送类指令 堆栈的概念: 进栈指令 (PUSH) 出栈指令(POP) 练习 LEA取偏移地址(有效地址EA)指令(去括号) LEA和OFFSET区别: 用法注意 LEA和MO…

汇编:lea指令学习

加载有效地址(load effective address)指令就是lea,他的指令形式就是从内存读取数据到寄存器,但是实际上他没有引用内存,而是将有效地址写入到目的的操作数,就像是C语言地址操作符&一样的功能,可以获取…

汇编中的lea指令的作用,简单清晰明了不废话!

首先看一下intel开发手册上对lea的官方解释: lea,官方解释Load Effective Address,即装入有效地址的意思,它的操作数就是地址; 常见的几种用法: 1、lea eax,[addr] 就是将表达式addr的值放入…

设计模式

简介 设计模式是一套被反复使用的、多数人知晓的、经过分类编目的、代码设计经验的总结。使用设计模式可以提高代码的可复用性、可维护性、可读性、稳健性以及安全性。 项目中合理地运用设计模式可以完美地解决很多问题,但滥用设计模式不但不会带来任何好处&#x…

设计模式选择题复习

1.在UML提供的图中,( )用于描述系统与外部系统及用户之间的交互 A.用例图 B.类图 C.对象图 D.部署图 2.在UML提供的图中,( )用于按时间顺序描述对象之间的交…

单例设计模式

一.何为单例设计模式 如其名字,单例设计模式就是指的是一个类中只允许存在一个对象实例。 在java中,我们存在两种创建单例模式的思路:饿汉式和懒汉式 ①饿汉式:在创建类时直接创建对象实例 public class SingleHungryMan {//建立类…

设计模式在程序中的使用

OO设计的主要目的,在于分割责任,将每个模块的责任降低到合理的程度,并对各个模块进行封装以及降低两个模块之间的耦合度,达到修改一处不影响另外一处的目的。 这个原则其实并不仅仅局限于OO设计,只是OO设计提供了更好…

设计模式之命令模式

命令模式 命令模式的定义非命令模式实现:命令模式的实现: 命令模式的定义 说实话这个模式挺令人纠结的,但从这个模式的定义上来看,有点让人摸不到什么头脑,而且查看资料以后会发现还是有点稀里糊涂的,说懂…

《C++ 设计模式》

作者: 一去、二三里 个人微信号: iwaleon 微信公众号: 高效程序员 设计模式(Design Pattern)代表了最佳的实践,在面向对象的编程中被很多老鸟们反复使用。使用设计模式有很多好处: 可重用代码保…

设计模式课程设计

文章目录 题目要求: 具体作业如下:一、设计思路二、所用模式介绍1.简单工厂模式2.装饰模式3.观察者模式 具体实现过程程序分为三个部分: PS.代码写的比较敷衍,主要是应付作业用,请大家自行斟酌抄袭 又到了一年两度的课程设计时间&…

23种设计模式总结

一、什么是设计模式 设计模式(Design pattern)是一套被反复使用、多数人知晓的、经过分类编目的、代码设计经验的总结。使用设计模式是为了可重用代码、让代码更容易被他人理解、保证代码可靠性。 毫无疑问,设计模式于己于他人于系统都是多赢…

设计模式之——桥接模式

设计模式: 前辈们对代码开发经验的总结,是解决特定问题的一系列套路。它不是语法规定。而是一套用来提高代码可复用性、可维护性、可读性、稳健性、以及安全性的解决方案 设计模式的本质是面向对象设计原则的实际运用,是对类的封装性、继承性…

面向对象程序设计

之前复习面向对象的时候整理的,丢出来一起分享一下。因为复习得很赶,只是大致的整理,且大部分图片来自老师的ppt,可能不是很准确。如果要详细了解其中的某个知识点请另外搜索。 但是老师不讲武德啊,明明提纲给了不按提…

MVC设计模式

MVC的全名是Model View Controller,是模型(Model)-视图(view)-控制器(controller)的缩写,是一种设计模式。它是用一种业务逻辑、数据与界面显示分离的方法来组织代码,将众多的业务逻辑聚集到一个部件里面,在…

设计模式考题复习

一.定义 设计模式六大基本原则: 单一职责原则:一个类或者一个方法只负责一项职责,尽量做到类的只有一个行为原因引起变化;里氏替换原则:能出现子类的地方都应该可以允许父类出现,也就是子类可以扩展父类的…