node.js常用路径以及文件增删查改

198 阅读4分钟

最近在做一些文件的处理,发现得好好的了解一些node.js中一些常见得路径.

1.绝对路径和相对路径的定义

绝对路径: 绝对路径是指目录下的绝对位置,直接到达目标位置,通常是从盘符开始的路径。 相对路径: 相对路径就是指由这个文件所在的路径引起的跟其它文件(或文件夹)的路径关系。 使用相对路径可以为我们带来非常多的便利。

2. node.js中的全局对象

在NodeJS里,是不可能在最外层定义一个变量,因为所有的用户代码都是当前模块的,只在当前模块里可用,但可以通过exports对象的使用将其传递给模块外部.所以,在NodeJS中,用var声明的变量并不属于全局的变量,只在当前模块生效像上述的global全局对象则在全局作用域中,任何全局变量、函数、对象都是该对象的一个属性值.

node.js中的全局对象分为真正的全局对象以及模块级别的全局对象

真正的全局对象有: Class:Buffer, process, console, clearInterval, setInterval, clearTimeout, setTimeout, global

process

process 对象是一个全局变量,提供了有关当前 Node.js进程的信息并对其进行控制,作为一个全局变量,例如我输入: node pathTest/index cute

console.log(process.argv) 
[
  'C:\\Program Files\\nodejs\\node.exe',
  'C:\\Users\\Administrator\\Desktop\\file\\pathTest\\index',
  'cute'
]

在终端通过 Node 执行命令的时候,通过 process.argv 可以获取传入的命令行参数,返回值是一个数组:

  • 0: Node 路径(一般用不到,直接忽略)
  • 1: 被执行的 JS 文件路径(一般用不到,直接忽略)
  • 2~n: 真实传入命令的参数

process.exit()可以结束进程

global

global为全局命名空间对象,processconsolesetTimeout等都有放到global

console.log(global.process === process) // true

模块级别的全局对象:__dirname, __filename, exports, module, require

3.__dirname

string当前模块的文件夹名称

1666601984049.png

index.js

console.log(__dirname); // C:\Users\Administrator\Desktop\file\pathTest

拿到了index.js所在的文件夹名称

因为 file directory 表示的是文件目录,所以__dirname表示的就是 directory name => 文件目录名

4.__filename

当前模块的文件名称---解析后的绝对路径。

// 当前模块的文件夹
console.log(__dirname); // C:\Users\Administrator\Desktop\file\pathTest
// 当前模块文件
console.log(__filename) // C:\Users\Administrator\Desktop\file\pathTest\index.js

5.path

path 模块提供了一些工具函数,用于处理文件与目录的路径。可以通过以下方式使用:

const path = require('path');
5.1 path.dirname()

path.dirname() 方法返回一个 path 的目录名

// 当前模块的文件夹
console.log(__dirname); // C:\Users\Administrator\Desktop\file\pathTest

// 当前模块文件
console.log(__filename) // C:\Users\Administrator\Desktop\file\pathTest\index.js

const path = require('path');
// 得到所传入的模块的文件夹路径
console.log(path.dirname(__filename)) // C:\Users\Administrator\Desktop\file\pathTest

不难发现,console.log(__dirname)与path.dirname(__filename)结果好像相等

console.log(__dirname === path.dirname(__filename)) // true

__dirname等同于 __filename 的 path.dirname() 的值

5.2 path.resolve()

path.resolve() 方法会把一个路径或路径片段的序列解析为一个绝对路径。

path.resolve()非常重要,平时我们去读某些文件,就需要通过他拿到一些文件得绝对路径

给定的路径的序列是从右往左被处理的,后面每个 path 被依次解析,直到构造完成一个绝对路径。 例如,给定的路径片段的序列为:/foo、/bar、baz,则调用 path.resolve('/foo', '/bar', 'baz') 会返回 /bar/baz

一般我们得场景是,当前模块里面去查找target页面得操作

1.如何拿到a.js

const fs = require('fs')
// 如何拿到a.js
const aPath = path.resolve(__dirname, './a.js')
fs.exists(aPath, (exists) => {
  console.log(exists ? 'aPath is there' : 'no passwd!'); // aPath is there
});
const fs = require('fs')
// 如何拿到a.js
const aPath = path.resolve(__dirname, 'a.js')
fs.exists(aPath, (exists) => {
  console.log(exists ? 'aPath is there' : 'no passwd!'); // aPath is there
});

以上两种都可以哈,查找a.js resolve()是从右边往左边, 如果遇到得是绝对路径,直接不往左边读了,应该就是左边的路径如何进入到右边target目录的问题

2.如何拿到b.js

const bPath = path.resolve(__dirname, '../b.js')
fs.exists(bPath, (exists) => {
  console.log(exists ? 'bPath is there---' : 'no passwd!'); // bPath is there
});

3.如何拿到c.js

const cPath = path.resolve(__dirname, '../brother/c.js')
fs.exists(cPath, (exists) => {
  console.log(exists ? 'cPath is there---' : 'no passwd!'); // cPath is there---
});

6.文件增删查

写入:

 fs.writeFileSync(path, data, { 'flag': 'a' }, function(err) {
    if (err) {
      throw err;
    }
  });
  // data为插入的数据

删除:

fs.unlink(path, (err) => {
  if (err) throw err;
  console.log('成功删除 XXXXX');
});

查询:

fs.exists(path, (exists) => {
  console.log(exists ? 'path is there' : 'no passwd!'); // bPath is there
});

获取文件:

fs.readFileSync(path[, options])

const res = fs.readFileSync(aPath); // buffer

有一点要注意,你会发现很多方法有Sync 有的没有,有Sync表示的就是同步,意思就是代码顺序执行

1666605720351.png

举个例子:

如果我一键生成一个excel文件,接下来要获取excel上的title,那么表示我一定是要等excel生成完,我才去获取title,如果我用的异步,可能excel刚生成一个空白文档,我就去获取,能获取到吗?这肯定是不对的,所以这时候我们保存文件要用writeFileSync,如果我做的事不依赖上一个,可以采用异步,这样不会阻拦我现在要做的事,时间上体验更好

参考:node.js中文文档