__dirname和__filename

article/2025/11/6 7:33:57

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 点击加入


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

相关文章

Linux利用filename=${fileuser:-filename}设置文档名

该语句的意思是:如果输入fileuser的有值的话,将该值付给filename 如果在读入变量fileuser的时候直接回车,意思是fileuser里面没有值,那么将”filename”赋予给filename。 以《鸟哥的linux私房菜》chap13中为例,创建的…

Already included file name .......

vue项目修改.vue的文件名之后会发生引入文件时报错 类似于这样 解决办法: 快捷键:Ctrl shift P,打开:“命令面板”,输入:重新加载 详情请见:Already included file name。。。。。Root file…

source 命令的用法(与 sh Filename、./Filename的区别)

source 命令简单来说,就是读取脚本里的语句,并在当前Shell中执行,脚本里面所有新建、改变变量的语句都会保存在当前shell里。 目录 1、source 命令的使用方法 2、source命令的妙用 3、source Filename 和 ./Filename的区别 1、source 命令…

C++ #include expects “FILENAME“ or <FILENAME>

include 标签只能是 #include<FILENAME> 或者 #include "" 要加引号啊

matlab中的imread (line 340) fullname = get_full_filename(filename);

错误提示 错误原因 没有将运行的文件添加到路径中。 解决方法 右击运行文件的文件夹 2.点击添加到路径–>选定的文件夹和子文件夹 3.最后再次尝试运行&#xff0c;问题解决

Already included file name

Already included file name ‘c:/Users/Administrator/Desktop/test/src/components/detailList.vue’ differs from file name ‘c:/Users/Administrator/Desktop/test/src/components/detaillist.vue’ only in casing. The file is in the program because: Imported via ‘…

Linux常见命令-1

一、tail命令 1、参数&#xff1a;tail -f filename 说明&#xff1a;查看filename文件的尾部内容&#xff0c;默认10行&#xff0c;相当于增加参数 -n 10&#xff0c;刷新显示在屏幕上。 示例&#xff1a; 2、参数&#xff1a;tail -n 20 filename 说明&#xff1a;显示file…

(九)Python:文件操作

一、读写文件 Python中使用open(filename,mode)执行打开文件操作。 filename&#xff1a;filename 变量是一个包含了你要访问的文件名称的字符串值。mode&#xff1a;mode决定了打开文件的模式&#xff1a;只读&#xff0c;写入&#xff0c;追加等。所有可取值见如下的完全列…

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

在每个模块中除了 require &#xff0c;exports 等模块相关 API之外&#xff0c;还有两个特殊的成员&#xff1a; __dirname&#xff1a;用来动态获取当前文件模块所属目录的绝对路径__filename&#xff1a;用来动态获取当前文件的绝对路径 示例&#xff1a; 现有如下一个问题…

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源码时&#xff0c;对cancleAcquire的理解比较肤浅&#xff08;停留在方…

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

这篇文章主要介绍了汇编语言lea指令使用方法解析,文中通过示例代码介绍的非常详细&#xff0c;对大家的学习或者工作具有一定的参考学习价值,需要的朋友可以参考下 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)

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

汇编指令lea 和 mov 区别

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

x86 LEA 指令

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

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

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

汇编:lea指令学习

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

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

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

设计模式

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

设计模式选择题复习

1.在UML提供的图中&#xff0c;&#xff08; &#xff09;用于描述系统与外部系统及用户之间的交互 A&#xff0e;用例图 B&#xff0e;类图 C&#xff0e;对象图 D&#xff0e;部署图 2.在UML提供的图中&#xff0c;&#xff08; &#xff09;用于按时间顺序描述对象之间的交…

单例设计模式

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