NodeJS 之 fs 模块(路径动态拼接问题)

  • 参考
  • 描述
  • 问题
    • 描述
    • 准备工作
      • content.txt
      • main.js
    • 复现
      • 前奏
      • 惊雷
      • 再探
      • 分析
  • 解决
    • __dirname
    • path 模块
      • path.join()
    • 解决

参考

项目 参考
搜索引擎 Bing
哔哩哔哩 黑马程序员

描述

项目 描述
操作系统 Windows 10 专业版
NodeJS 18.13.0

问题

描述

在使用 NodeJS 的 fs 模块处理文件时,你可能经常在路径中使用 ./../ 来指明某个文件(夹)位于当前工作目录或其父目录中。使用相对路径指定文件的位置相比使用绝对路径来指定文件的位置要方便许多,但这样可能会导致意外事故的发生。

准备工作

content.txt

这是 content.txt 文件中的内容,我们稍后将通过 fs 模块读取该文件。

隐约雷鸣,阴霾天空。但盼风雨来,能留你在此。
隐约雷鸣,阴霾天空。即使无天雨,我亦留此地。

main.js

这是 main.js 文件中的内容,稍后我将通过 NodeJS 执行该文件以读取 content.txt 文件中的内容。

const fs = require('fs');// 尝试读取当前工作目录下的 content.txt 文件
fs.readFile('./content.txt', 'utf-8', (err, data) => {if(err){console.log('【文件读取失败】')}else{console.log(data)}
})

注:

  1. content.txtmain.js 文件位于同一目录之下。
  2. content.txtmain.js 文件所在的路径分别为:
    • C:\Users\36683\Template\content.txt
    • C:\Users\36683\Template\main.js

复现

前奏

进入 main.js 所在的目录下后,在终端中输入如下命令以执行 main.js 文件中的内容。

node main.js

终端将输出如下内容:

隐约雷鸣,阴霾天空。但盼风雨来,能留你在此。
隐约雷鸣,阴霾天空。即使无天雨,我亦留此地。

惊雷

首先,让我们使用如下命令进入当前目录的父级目录中:

cd ..

执行如下命令以读取 content.txt 文件中的内容:

node Template/main.js

打印结果为:

【文件读取失败】

再探

由于我们使用 fs 模块捕获了错误,所以错误信息并没有打印出来。我们需要获得错误信息以对该问题产生的原因有更准确的了解。

main.js 文件中的内容修改为:

const fs = require('fs');// 尝试读取当前工作目录下的 content.txt 文件
fs.readFile('./content.txt', 'utf-8', (err, data) => {if(err){console.log('【文件读取失败】');// 打印错误信息console.log(err.message);}else{console.log(data)}
})

再次执行如下命令以读取 content.txt 文件中的内容:

node Template/main.js

打印结果:

【文件读取失败】
ENOENT: no such file or directory, open ‘C:\Users\36683\content.txt’

分析

content.txt 文件的路径应该为:

C:\Users\36683\Template\content.txt

可再错误信息中得到的却是:

C:\Users\36683\content.txt

这是因为,NodeJS 在执行 JavaScript 文件时,会将其中的相对路径与执行命令时所在的工作目录进行拼接。

解决

前面你所认识到的问题便是路径拼接问题,该问题的解决方法有两种:

  1. 使用绝对路径而非相对路径指定计算机中的文件。
  2. 通过 NodeJS 来获取被 NodeJS 执行的文件所在的文件夹的路径与目标文件(将要读取的文件)的相对路径进行拼接得到目标文件的绝对路径。

第一种解决方式相信各位都懂;第二种方式更具灵活性,不用担心将项目文件(包含 content.txtmain.js 文件的文件夹)转移到其他计算机后无法正常使用。

__dirname

__dirname 是 NodeJS 中内置的一个变量,保存着该文件所在的目录的路径。

首先,让我们在终端中使用如下命令切换工作目录至 main.js 文件所在的文件夹中。

cd Template

进来该目录后,将 main.js 修改为如下内容。

const fs = require('fs');// 尝试读取当前工作目录下的 content.txt 文件
fs.readFile('./content.txt', 'utf-8', (err, data) => {if(err){console.log('【文件读取失败】');console.log(err.message);}else{console.log(__dirname)}
})

执行结果为:

C:\Users\36683\Template

path 模块

在使用 __dirname 获取到被 NodeJS 执行的文件所在的文件夹的路径后,我们需要将其与目标文件(将要读取的文件)的相对路径进行拼接。

路径的拼接尽量不要使用像拼接字符串那样使用 + 号进行拼接,更好的方法是使用 NodeJS 内置的 path 模块中 path.join() 来进行拼接。

path.join()

Windows 使用的文件分割符为 \ ,当然你也可以使用 / ,但这并不规范;而在 LinuxMacOS 中,操作系统使用的文件分割符均为 / ,在这些操作系统中,\ 将被理解为转义字符的前缀。

为了 提高程序在不同平台中的兼容性 ,我们需要正确的使用文件分隔符,而 path.join() 很好的解决了这个问题。

path.join() 方法使用特定于平台的分隔符作为定界符将所有给定的 path 片段连接在一起,然后规范化生成的路径。

path.join([...paths])
项目 描述
paths paths 为一个路径中所有被符号分割的文件(夹)名或盘符,你需要将这些片段按照一定的顺序传递给 path.join() 函数。

举个栗子:

const path = require('path');result = path.join('c', 'TwoMoons', 'RedHeart');
console.log(result)

打印结果:

C:\Users\36683\Template

注:

由打印结果可以发现,path.join() 将我们传递给其的 c 转换为 C

解决

main.js 修改为如下内容后,切换工作目录为当前工作目录的父级目录。

const fs = require('fs');
const path = require('path');const target = path.join(__dirname, 'content.txt')// 尝试读取当前工作目录下的 content.txt 文件
fs.readFile(target, 'utf-8', (err, data) => {if(err){console.log('【文件读取失败】');console.log(err.message);}else{console.log(data)}
})

执行结果:

隐约雷鸣,阴霾天空。但盼风雨来,能留你在此。
隐约雷鸣,阴霾天空。即使无天雨,我亦留此地。

至此,路径动态拼接问题已成功解决。

NodeJS 之 fs 模块(路径动态拼接问题)相关推荐

  1. nodejs学习-fs模块

    B站黑马nodejs node.js是一个基于Chrome V8引擎的JavaScript运行环境. 注意: 浏览器是JavaScript的前端运行环境 Node.js是JavaScript的后端运行 ...

  2. NodeJS 之 fs 模块(文件操作)

    NodeJS 之 fs 模块(文件系统模块) 参考 描述 fs(File System) 文件 读取 fs.readFile() 判断文件是否读取成功 编码 写入 fs.writeFile() 覆盖 ...

  3. NodeJs 的fs模块

    <1>js 里面的fs模块 readFile(),readFileSync() writeFile(),writeFileSync() exists(path, callback) mkd ...

  4. 学习笔记-nodejs之fs模块

    内容大纲 fs模块 属性 文件(夹)是否存在 统计信息 文件 创建 删除 复制 重命名 文件内容 打开 读取 写入 追加 目录 创建 删除 递归删除 异步删除 读取 移动 监视 文件 文件夹 权限 f ...

  5. 微信小程序 - <image>图片 src 路径动态拼接多个变量

    前言 在微信小程序中对于动态图像 src 路径,您无法像正常 Vue 项目那样拼接变量路径,这归结于小程序框架底层. 在正常 Vue 中,一个默认字符串和一个变量,很容易实现. 但在微信小程序中,您会 ...

  6. nodejs基础 ps模块常用API用法

    nodejs的fs模块就是针对文件和文件夹进行一系列的操作 常用的fs模块API(感兴趣的可以去node官网看更多的) fs.readFile():用来读取文件内容的函数 fs.readdir():读 ...

  7. php node 目录,node.js基于fs模块对系统文件及目录进行读写操作的方法详解

    本文主要介绍了node.js基于fs模块对系统文件及目录进行读写操作的方法,结合实例形式分析了nodejs使用fs模块针对文件与目录的读写.创建.删除等相关操作技巧,需要的朋友可以参考下. 如果要用这 ...

  8. nodejs01——安装及使用、服务端及客户端、commonjs规范、fs模块的使用(文件操作及目录操作)、stream、buffer、WebServer、端口、动态资源及静态资源、头信息、请求方式

    nodejs的安装及使用 服务端及客户端 commonjs规范 fs模块的使用(文件操作及目录操作) stream buffer // Node.js介绍 Node.js 诞生于2009年,Node. ...

  9. nodejs fs模块

    本文转载自 https://www.cnblogs.com/starof/p/5038300.html nodejs模块--fs模块 fs模块用于对系统文件及目录进行读写操作. 一.同步和异步 使用r ...

最新文章

  1. 医疗人工智能会替代医生吗
  2. Dapper官方教程翻译8:Dapper方法之QueryMultiple(转)
  3. 【总结】循序渐进,有三AI不得不看的技术综述(超过100篇核心干货)
  4. python爬虫代码优化:使用生成器重构提取数据方法
  5. C++ 值传递、指针传递、引用传递
  6. 创建Java动态代理
  7. 《游戏设计师修炼之道:数据驱动的游戏设计》一3.8小结
  8. 前端学习(1781):前端调试之security节点讲解
  9. 基于python的入侵检测系统毕设_基于深度学习的射频指纹的物联网设备入侵检测...
  10. Win10电脑如何找出隐藏的文件
  11. Win10不能直接拖文件/Foxmail不能拖文件解决办法
  12. ubuntu 14.04 安装中文输入法fcitx
  13. iOS 版本更新迭代
  14. FlightGear命令行参数
  15. 微信背后的产品观 - 张小龙内部8小时演讲
  16. 计算机网络专业运动会入场式,高校运动会方阵入场式花样百出
  17. 期权定价模型BS模型及反推隐含波动率 golang实现
  18. 在龙芯3A5000上测试SPEC CPU 2006
  19. uniapp小程序实现开屏页
  20. H-Chat:用户私聊群聊管理

热门文章

  1. 用Hyperledger cello的0.9.0-h3c分支创建一套区块链系统
  2. linphone 手机上不能接听电话
  3. HTML核心(1)- 第一个网页
  4. 计算机专业助我成长作文600,资助助我成长作文
  5. 从0到10亿,微信后台架构及基础设施设计与实践!
  6. Java基础案例3-1:基于控制台的购书系统
  7. 微信春节大数据出炉:《三体》阅读量第一 ;曝iOS 17应用商店将向第三方开放;斯坦福大学推出DetectGPT|极客头条
  8. 简单介绍下C/S与B/S架构的异同
  9. 《花开伊吕波》26集片尾曲歌词
  10. SQL中的case when函数使用