NodeJs之fs模块

一、定义:

fs 模块可以实现与硬盘的交互。例如:文件的创建、删除、重命名、移动;文件内容的写入、读取;文件夹的操作。

二、引入 fs 模块:

const fs = require('fs')

三、文件写入:

1、异步写入:writeFile

① 语法:

fs.writeFile(file,data[, options], callback)

② 参数说明:

(1)file:指定目标文件的路径或标识符。

类型:字符串、BufferURL 或文件描述符(整数)

如果路径中没有该文件,则会创建一个文件;如果路径中有该文件,默认会重写文件中的内容。

(2)data:待写入的数据。

类型:字符串、BufferTypedArrayDataView

(3)options:配置项(可选)

类型:字符串(仅编码格式)或对象(包含多个配置项)
可选属性:
encoding

  • 默认值:utf8
  • 作用:指定文本数据的编码格式,支持 asciibase64hex

flag

  • 默认值:w(覆盖写入,文件不存在则创建)
  • 其它值:
    a:追加内容(文件不存在则创建)
    wx:写入失败(若文件已存在)
(4)callback:回调函数。

写入完成后调用,会接收一个参数,写入成功,该参数为 null;写入失败,该参数为 错误对象

③ 示例:

const fs = require('fs')
// 写入文件时建立连接,写入完毕断开连接
fs.writeFile("./fs1.txt", "异步文件写入的内容", err => {if (err) {console.log('写入失败:' + err)return}console.log('写入成功')
})

④ 使用场景:

适用于写入频次较低的场景

2、同步写入:writeFileSync

① 语法:
fs.writeFileSync(file,data[, options])
② 参数说明:
(1)file:指定目标文件的路径或标识符。

类型:字符串、BufferURL 或文件描述符(整数)

如果路径中没有该文件,则会创建一个文件;如果路径中有该文件,默认会重写文件中的内容。

(2)data:待写入的数据。

类型:字符串、BufferTypedArrayDataView

(3)options:配置项(可选)

类型:字符串(仅编码格式)或对象(包含多个配置项)
可选属性:
encoding

  • 默认值:utf8
  • 作用:指定文本数据的编码格式,支持 asciibase64hex

flag

  • 默认值:w(覆盖写入,文件不存在则创建)
  • 其它值:
    a:追加内容(文件不存在则创建)
    wx:写入失败(若文件已存在)
(3)示例:
const fs = require('fs')
fs.writeFileSync("./fs2.txt", "同步文件写入的内容")

3、异步追加写入:

appendFile

(1)语法:
fs.appendFile(path,data[, options], callback)
(2)参数说明:
a、path:文件名(所在的路径)。

类型:字符串、BufferURL 或文件描述符(整数)

如果路径中没有该文件,则会创建一个文件;如果路径中有该文件,默认会重写文件中的内容。

b、data:待写入的数据。

类型:字符串、Buffer
\r\n 表示换行

c、options:配置项(可选)

类型:字符串(仅编码格式)或对象(包含多个配置项)
可选属性:
encoding

  • 默认值:utf8
  • 作用:指定文本数据的编码格式,支持 asciibase64hex

flag

  • 默认值:a(追加模式,文件不存在则创建)
  • 其它值:
    a+:追加且可读
    wx:文件存在时报错
d、callback:回调函数。

写入完成后调用,会接收一个参数,写入成功,该参数为 null;写入失败,该参数为 错误对象

(3)示例:
const fs = require('fs')
fs.appendFile("./fs3.txt", "\r\n文件追加的内容", err => {if (err) {console.log('追加写入失败:'+err)return}console.log('追加写入成功')
})

writeFile

const fs = require('fs')
fs.writeFile("./fs3.txt", "配置文件追加写入---love",{flag: 'a'
}, err => {if (err) {console.log('追加写入失败:'+err)return}console.log('追加写入成功')
})

4、同步追加写入:appendFileSync

① 语法:

fs.appendFileSync(file,data[, options])

② 参数说明:

a、path:文件名(所在的路径)。

类型:字符串、BufferURL 或文件描述符(整数)

如果路径中没有该文件,则会创建一个文件;如果路径中有该文件,默认会重写文件中的内容。

b、data:待写入的数据。

类型:字符串、Buffer
\r\n 表示换行

c、options:配置项(可选)

类型:字符串(仅编码格式)或对象(包含多个配置项)
可选属性:
encoding

  • 默认值:utf8
  • 作用:指定文本数据的编码格式,支持 asciibase64hex

flag

  • 默认值:a(追加模式,文件不存在则创建)
  • 其它值:
    a+:追加且可读
    wx:文件存在时报错

③ 示例:

const fs = require('fs')
fs.appendFileSync("./fs3.txt", "\r\n文件同步内容")

5、流式写入:createWriteStream

① 语法:

fs.createWriteStream(path[, options])

② 参数说明:

(1)path:文件名(所在的路径)。

类型:字符串、BufferURL 或文件描述符(整数)

如果路径中没有该文件,则会创建一个文件;如果路径中有该文件,默认会重写文件中的内容。

(2)options:配置项(可选)

类型:字符串(仅编码格式)或对象(包含多个配置项)

可选属性:

encoding

  • 默认值:utf8
  • 作用:指定文本数据的编码格式,支持 asciibase64hex

flags

  • 默认值:w(覆盖写入,文件不存在则创建)
  • 其它值:
    a:追加内容到文件末尾
    r+:修改文件内容(非覆盖),需配合 start 参数指定写入位置
    wx:文件存在时报错

autoClose

  • 默认值:true(自动关闭文件描述符)。
  • 作用:若设为 false,需手动调用 close() 关闭流

start

  • 作用:指定写入起始位置(字节偏移量),需在 r+'模式下生效

emitClose

  • 默认值:false(不触发 close 事件)。
  • 作用:设为 true 时,流销毁后会触发 close 事件

③ 返回值:

Object

④ 示例:

const fs = require('fs')
// 创建文件写入流对象,和文件建立连接
let ws = fs.createWriteStream("./fs4.txt")
// 写入内容,和文件不会断开连接
ws.write('春眠不觉晓\r\n')
ws.write('处处闻啼鸟\r\n')
ws.write('夜来风雨声\r\n')
ws.write('花落知多少\r\n')
// 断开连接 -- 可选,当脚本文件执行完毕后,资源会被回收,通道也会被断开。
ws.close()

⑤ 使用场景:

适用于大文件写入或者写入频次较高的场景

四、文件读取:

1、异步读取:readFile

① 语法:

fs.readFile(path[, options], callback)

② 参数说明:

(1)path:指定目标文件的路径或标识符。

类型:字符串、BufferURL 或文件描述符(整数)

(2)options:配置项(可选)

类型:字符串(仅编码格式)或对象(包含多个配置项)
可选属性:
encoding

  • 默认值:null(返回原始 Buffer 数据)
  • 作用:指定文本内容的编码格式 ,可选值是 utf8asciibase64

flag

  • 默认值:r(以只读模式打开文件)
  • 其它值:
    w:覆盖文件(文件不存在则创建)
    a:追加内容(文件不存在则创建)
(3)callback:回调函数。

读取完成后调用,会接收两个参数。
参数1:读取成功,该参数为 null;读取失败,该参数为 错误对象
参数2:读取文件的内容

③ 示例:

const fs = require('fs')
fs.readFile('./fs5.txt', (err,data) => {if (err) {console.log('文件读取失败')return}// console.log(data)console.log(data.toString())
})

2、同步读取:readFileSync

① 语法:

fs.readFileSync(path[, options])

② 参数说明:

(1)path:指定目标文件的路径或标识符。

类型:字符串、BufferURL 或文件描述符(整数)

若路径错误(如文件不存在或权限不足),会抛出 ENOENT 错误

(2)options:配置项(可选)

类型:字符串(仅编码格式)或对象(包含多个配置项)
可选属性:
encoding

  • 默认值:null(返回原始 Buffer 数据)
  • 作用:指定文本内容的编码格式 ,可选值是 utf8asciibase64

flag

  • 默认值:r(以只读模式打开文件)
  • 其它值:
    r+:读写模式
    a:追加模式

③ 示例:

const fs = require('fs')
let data = fs.readFileSync('./fs5.txt')
console.log(data.toString())

3、流式读取:createReadStream

① 语法:

fs.createReadStream(path[, options])

② 参数说明:

(1)path:文件名(所在的路径)。

类型:字符串、BufferURL 或文件描述符(整数)

若路径错误(如文件不存在或权限不足),会抛出 ENOENT 错误

(2)options:配置项(可选)

类型:字符串(仅编码格式)或对象(包含多个配置项)

可选属性:

encoding

  • 默认值:null,返回 Buffer
  • 作用:指定数据编码格式,支持 utf8asciibase64hex

flags

  • 默认值:r(只读模式)
  • 其它值:
    a:追加内容到文件末尾
    r+:读写
    wx:文件存在时报错

autoClose

  • 默认值:true(自动关闭文件描述符)。
  • 作用:若设为 false,需手动调用 close() 关闭流

start

  • 作用:读取起始字节位置(含)

end

  • 作用:读取结束字节位置(含)。若未指定 start,默认从文件头开始读取

③ 返回值:

Object

④ 示例:

const fs = require('fs')
// let rs = fs.createReadStream('./fs5.txt')
let rs = fs.createReadStream('./resource/food.mp4')
rs.on('data', chunk => { // 分块读取,每个块的最大容量为 65536字节 = 64KB// console.log(chunk) console.log(chunk.length)
})rs.on('end', () => {console.log('读取完毕')
})

五、文件复制:

1、全文件操作:

const fs = require('fs')
let fileData = fs.readFileSync('./resource/food.mp4')
fs.writeFile('./resource/food2.mp4',fileData, err => {if (err) {console.log(`文件复制失败--${err}`)return}console.log(`文件复制成功`)
})

2、流式文件操作:

const fs = require('fs')
const process = require('process')
let rs = fs.createReadStream("./resource/food.mp4")
let ws = fs.createWriteStream("./resource/food3.mp4")
// 方式一:
rs.on('data', chunk => {ws.write(chunk)
})
rs.on('end', () => {console.log(process.memoryUsage()) // { rss: 31657984, heapTotal: 5791744, heapUsed: 3381216,external: 10385147,arrayBuffers: 9269529 }console.log(`文件复制完毕,代码内存占用量:${process.memoryUsage().rss}`) // rss  31830016 = 30MB
})
// 方式二:
rs.pipe(ws)

六、文件的重命名与移动:

1、文件的重命名:

① 异步重命名:rename

(1) 语法:
fs.rename(oldpath, newpath, callback)
(2) 参数说明:
a、oldpath:指定需重命名或移动的原始文件/目录路径。

类型:字符串、BufferURL 或文件描述符(整数)

若路径不存在或权限不足,回调函数会返回 ENOENTEPERM 错误

b、newpath:指定目标文件/目录的新路径或名称。

类型:字符串、BufferURL 或文件描述符(整数)

newPath 已存在且为文件:直接覆盖原文件
newPath 为目录:抛出 EISDIR 错误
路径要求:目标路径的父目录必须存在,否则抛出 ENOENT 错误

c、callback:操作完成后的回调函数。

完成后调用,会接收一个参数,成功参数为 null;失败参数为 错误对象

(3) 示例:
const fs = require('fs')
fs.rename('./fs5.txt', './红楼梦.txt', err => {if (err) {console.log('文件重命名失败')return}console.log('文件重命名成功')
})

② 同步重命名:

(1) 语法:
fs.renameSync(oldpath, newpath)
(2) 参数说明:
a、oldpath:指定需重命名或移动的原始文件/目录路径。

类型:字符串、BufferURL 或文件描述符(整数)

若路径不存在或权限不足,回调函数会返回 ENOENTEPERM 错误

b、newpath:指定目标文件/目录的新路径或名称。

类型:字符串、BufferURL 或文件描述符(整数)

newPath 已存在且为文件:直接覆盖原文件
newPath 为目录:抛出 EISDIR 错误
路径要求:目标路径的父目录必须存在,否则抛出 ENOENT 错误

(3) 示例:
const fs = require('fs')
fs.renameSync('./resource/food2.mp4', './food.mp4')

2、文件的移动:

移动和重命名一样,只是改变了文件的路径

七、文件删除:

1、通用:

① 异步文件删除:unlink

(1) 语法:
fs.unlink(path, callback)
(2) 参数说明:
a、path:表示要删除的文件路径。

类型:字符串、BufferURL

如果路径指向目录而非文件,会抛出EISDIR错误(需使用fs.rmdir删除目录)
路径需确保存在且权限足够,否则会触发错误(如ENOENT表示文件不存在,EPERM表示权限不足)

b、callback:操作完成后的回调函数。

完成后调用,会接收一个参数,成功参数为 null;失败参数为 错误对象

(3) 示例:
const fs = require('fs')
fs.unlink('./fs3.txt', err => {if (err) {console.log('文件删除失败')return}console.log('文件删除成功')
})

② 同步文件删除:unlinkSync

(1) 语法:
fs.unlinkSync(path)
(2) 参数说明:
a、path:表示要删除的文件路径。

类型:字符串、BufferURL

如果路径指向目录而非文件,会抛出EISDIR错误(需使用fs.rmdir删除目录)
路径需确保存在且权限足够,否则会触发错误(如ENOENT表示文件不存在,EPERM表示权限不足)

(3) 示例:
const fs = require('fs')
try {fs.unlinkSync('./food.mp4')console.log('删除成功');
} catch (err) {console.error('删除失败:', err.message);
}

2、node 14.14.0 版本以上

① 异步文件删除:rm

(1) 语法:
fs.rm(path[, options], callback)
(2) 参数说明:
a、path:指定要删除的文件或目录的路径。

类型:字符串、BufferURL

b、options:操作完成后的回调函数。

类型:对象
可选属性:
recursive

  • 默认值:false(不会递归删除目录及其所有子目录和文件)
  • 作用:是否递归删除目录及其所有子目录和文件,若路径是文件,此参数无效。

force

  • 默认值:false
    作用:设置为true时,若路径不存在,忽略错误(不触发ENOENT)。适用于需要静默处理路径不存在的情况

maxRetries
类型:整数

  • 默认值:0。
  • 作用:在遇到EBUSYENOTEMPTY等错误时,设置重试次数。

retryDelay
类型:整数

  • 默认值:100(毫秒)。
  • 作用:重试操作前的等待时间。
c、callback:操作完成后的回调函数。

完成后调用,会接收一个参数,成功参数为 null;失败参数为 错误对象

(3) 示例:
const fs = require('fs')
fs.rm('./fs2.txt', err => {if (err) {console.log('文件删除失败')return}console.log('文件删除成功')
})

② 同步文件删除:rmSync

(1) 语法:
fs.rmSync(path[, options])
(2) 参数说明:
a、path:指定要删除的文件或目录的路径。

类型:字符串、BufferURL

b、options:操作完成后的回调函数。

类型:对象
可选属性:
recursive

  • 默认值:false(不会递归删除目录及其所有子目录和文件)
  • 作用:是否递归删除目录及其所有子目录和文件,若路径是文件,此参数无效。

force

  • 默认值:false
    作用:设置为true时,若路径不存在,忽略错误(不触发ENOENT)。适用于需要静默处理路径不存在的情况

maxRetries
类型:整数

  • 默认值:0。
  • 作用:在遇到EBUSYENOTEMPTY等错误时,设置重试次数。

retryDelay
类型:整数

  • 默认值:100(毫秒)。
  • 作用:重试操作前的等待时间。
(3) 示例:
const fs = require('fs')
try {fs.rmSync('./fs1.txt')console.log('删除成功');
} catch (err) {console.error('删除失败:', err.message);
}

八、文件夹操作:

1、创建文件夹:

① 异步创建文件目录:mkdir

(1) 语法:
fs.mkdir(path[, options], callback)
(2) 参数说明:
a、path:目标目录的完整路径。

类型:字符串、BufferURL

如果路径指向目录而非文件,会抛出EISDIR错误(需使用fs.rmdir删除目录)
路径需确保存在且权限足够,否则会触发错误(如ENOENT表示文件不存在,EPERM表示权限不足)

b、options

类型:对象或整数(旧版本兼容)
可选属性:
recursive

  • 默认值:false(不会递归创建父目录)
  • 作用:是否递归创建父目录
c、callback:操作完成后的回调函数。

参数:(err, path) => {}

  • err:操作失败时的错误对象(成功时为null)。
  • path(仅递归模式下):返回第一个被创建的目录路径(若无新目录创建则为undefined
(3) 示例:
a、创建目录 – 基本用法
const fs = require('fs')
fs.mkdir('./a', err => {if (err) {console.log('文件夹创建失败')throw err;}console.log('文件夹创建成功')
})
b、创建目录 – 递归用法
const fs = require('fs')
fs.mkdir('./b/c/d', {recursive: true
}, err => {if (err) {console.log('文件夹创建失败')throw err;}console.log('文件夹创建成功')
})

② 同步创建文件目录:mkdirSync

(1) 语法:
fs.mkdirSync(path[, options])
(2) 参数说明:
a、path:目标目录的完整路径。

类型:字符串、BufferURL

如果路径指向目录而非文件,会抛出EISDIR错误(需使用fs.rmdir删除目录)
路径需确保存在且权限足够,否则会触发错误(如ENOENT表示文件不存在,EPERM表示权限不足)

b、options

类型:对象或整数(旧版本兼容)
可选属性:
recursive

  • 默认值:false(不会递归创建父目录)
  • 作用:是否递归创建父目录
(3) 示例:
a、创建目录 – 基本用法
const fs = require('fs')
try {fs.mkdirSync('./logs'); // 默认recursive: falseconsole.log('目录创建成功');
} catch (err) {console.error('错误:', err.message);
}
b、创建目录 – 递归用法
const createdPath = fs.mkdirSync('./资源/components', { recursive: true });
console.log('首个创建目录路径:', createdPath); // 输出:XXX\资源

2、读取文件夹:

① 异步读取文件目录:readdir

(1) 语法:
fs.readdir(path[, options], callback)
(2) 参数说明:
a、path:目标目录的完整路径。

类型:字符串、BufferURL

路径需确保存在且权限足够,否则会触发错误(如ENOENT表示文件不存在,EPERM表示权限不足)

b、options

类型:字符串(指定编码)或对象
可选属性:
encoding

  • 默认值:utf8
  • 作用:指定返回文件名的字符编码
  • 其它值:buffer

withFileTypes

  • 默认值:false(数组中元素的类型为字符串)
  • 作用:指定返回数组的数据类型
  • 其它值:true(返回数组中的元素为fs.Dirent对象)
c、callback:操作完成后的回调函数。

参数:(err, files) => {}

  • err:操作失败时的错误对象(成功时为null)。
  • files:包含目录下所有文件和子目录名称的数组(不包含...
(3) 示例:
const fs = require('fs')
fs.readdir('./', (err, files) => {if (err) {console.error('读取失败:', err.message);return;}console.log('目录内容:', files); // 输出如:[ '1_buffer.js','2_fs.js','a', 'b','logs', 'resource', '红楼梦.txt', '资源']
});

② 同步读取文件目录:readdirSync

(1) 语法:
fs.readdirSync(path[, options])
(2) 参数说明:
a、path:目标目录的完整路径。

类型:字符串、BufferURL

路径需确保存在且权限足够,否则会触发错误(如ENOENT表示文件不存在,EPERM表示权限不足)

b、options

类型:字符串(指定编码)或对象
可选属性:
encoding

  • 默认值:utf8
  • 作用:指定返回文件名的字符编码
  • 其它值:buffer

withFileTypes

  • 默认值:false(数组中元素的类型为字符串)
  • 作用:指定返回数组的数据类型
  • 其它值:true(返回数组中的元素为fs.Dirent对象)
(3) 示例:
const fs = require('fs')
const files = fs.readdirSync('./resource');
console.log('目录内容:', files); // [ 'food3.mp4' ]

3、删除文件夹:

① 异步删除文件目录:rmdir

(1) 语法:
fs.rmdir(path[, options], callback)
(2) 参数说明:
a、path:目标目录的完整路径。

类型:字符串、BufferURL

如果路径指向目录而非文件,会抛出EISDIR错误(需使用fs.rmdir删除目录)
路径需确保存在且权限足够,否则会触发错误(如ENOENT表示文件不存在,EPERM表示权限不足)

b、options

类型:对象
可选属性:
recursive

  • 默认值:false(不会递归删除子目录)
  • 作用:是否递归删除子目录

maxRetries
类型:整数

  • 默认值:0。
  • 作用:在遇到EBUSYENOTEMPTY等错误时,设置重试次数。仅当recursive: true时生效

retryDelay
类型:整数

  • 默认值:100(毫秒)。
  • 作用:重试操作前的等待时间。仅当recursive: true时生效
c、callback:操作完成后的回调函数。

参数:(err) => {}

  • err:操作失败时的错误对象(成功时为null)。
(3) 示例:
a、删除目录 – 基本用法
const fs = require('fs')
fs.rmdir('./资源/components', (err) => {if (err) console.error('删除失败:', err.message);else console.log('目录已删除');
});
b、删除目录 – 递归不推荐用法

递归模式在v14.14.0+已弃用,推荐使用fs.rm

const fs = require('fs')
fs.rmdir('logs', { recursive: true }, (err) => {if (err) console.error('删除失败:', err.message);else console.log('目录已删除');
})
c、删除目录 – 递归推荐用法
const fs = require('fs')
fs.rm('1', { recursive: true, force: true }, (err) => {if (err) console.error('删除失败:', err.message);else console.log('目录已删除');
})

② 同步删除文件目录:rmdirSync

(1) 语法:
fs.rmdirSync(path[, options])
(2) 参数说明:
a、path:目标目录的完整路径。

类型:字符串、BufferURL

如果路径指向目录而非文件,会抛出EISDIR错误(需使用fs.rmdir删除目录)
路径需确保存在且权限足够,否则会触发错误(如ENOENT表示文件不存在,EPERM表示权限不足)

b、options

类型:对象
可选属性:
recursive

  • 默认值:false(不会递归删除子目录)
  • 作用:是否递归删除子目录

maxRetries
类型:整数

  • 默认值:0。
  • 作用:在遇到EBUSYENOTEMPTY等错误时,设置重试次数。仅当recursive: true时生效

retryDelay
类型:整数

  • 默认值:100(毫秒)。
  • 作用:重试操作前的等待时间。仅当recursive: true时生效
(3) 示例:
a、删除目录 – 基本用法
const fs = require('fs')
try {fs.rmdirSync('./资源');} catch (err) {if (err.code === 'ENOTEMPTY') {console.log('目录非空,请启用递归选项');}
}
b、删除目录 – 递归不推荐用法

递归模式在v14.14.0+已弃用,推荐使用fs.rmSync
在这里插入图片描述

const fs = require('fs')
try {fs.rmdirSync('b', { recursive: true });
} catch (err) {if (err.code === 'ENOTEMPTY') {console.log('目录非空,请启用递归选项');}
}
c、删除目录 – 递归推荐用法
const fs = require('fs')
try {fs.rmSync('./8/9', { recursive: true });
} catch (err) {if (err.code === 'ENOTEMPTY') {console.log('目录非空,请启用递归选项');}
}

九、查看资源状态:

1、异步查看:stat

① 语法:

fs.stat(path[, options], callback)

② 参数说明:

(1)path:目标文件或目录的路径。

类型:字符串、BufferURL

(2)options:配置项(可选)

类型:对象
可选属性:
bigint

  • 默认值:false
  • 作用:若设为true,返回的fs.Stats对象中数值属性将使用BigInt类型,避免大数精度丢失(Node.js ≥10.5.0支持
(3)callback:回调函数。
  • 参数:(err, stats) => {}
    err:操作失败时的错误对象(如路径不存在ENOENT或权限不足EACCES)。
    statsfs.Stats对象,包含文件/目录的详细信息

③ 示例:

fs.stat("./resource/food3.mp4", (err, stats) => {if (err) throw errconsole.log(stats)
})

在这里插入图片描述

2、同步查看:statSync

① 语法:

fs.statSync(path[, options])

② 参数说明:

(1)path:目标文件或目录的路径。

类型:字符串、BufferURL

(2)options:配置项(可选)

类型:对象
可选属性:
bigint

  • 默认值:false
  • 作用:若设为true,返回的fs.Stats对象中数值属性将使用BigInt类型,避免大数精度丢失(Node.js ≥10.5.0支持

③ 示例:

try {const stats = fs.statSync("./resource/food3.mp4")console.log(stats);
} catch (err) {console.error('错误:', err.message);
}

3、判断是否为文件:stats.isFile()

try {const stats = fs.statSync("./resource/food3.mp4")console.log(stats.isFile()); // true
} catch (err) {console.error('错误:', err.message);
}

4、判断是否为目录:stats.isDirectory()

try {const stats = fs.statSync("./resource/food3.mp4")console.log(stats.isDirectory()); // false
} catch (err) {console.error('错误:', err.message);
}

十、相对路径的参照物引发的问题:

1、相对路径的参照物:命令行的工作目录

当使用相对路径操作目标 文件/文件夹时,会从命令行所在的目录进行查找目标 文件/文件夹,然后进行操作。所以会导致文件的操作随着命令行工作的目录的变换而变换。

2、解决办法:

使用绝对路径

① 绝对路径的表示方式一:D:\XX\XX\XXX.txt
② 绝对路径的表示方式二:/
③ 绝对路径的表示方式三: __dirname

该变量存储的值:当前__dirname 所在文件的 所在目录的绝对路径

console.log(__dirname)
// 这个写法不规范,需要使用path模块来规范当前的路径
fs.writeFileSync(__dirname+ "/test.txt",  '在不同位置的命令行运行这个文件')
④ 绝对路径的表示方式三: __filename

获取当前文件的绝对路径:__filename

console.log(__filename)
let res = fs.statSync(__filename)
console.log(res)

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.rhkb.cn/news/41730.html

如若内容造成侵权/违法违规/事实不符,请联系长河编程网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

Android14 Settings应用添加有线网开关条目实现

Android14 Settings应用添加有线网开关条目 文章目录 Android14 Settings应用添加有线网开关条目一、前言二、适配修改1、network_provider_settings.xml2、NetworkProviderSettings.java3、TurnOnOffEthernetNetworkController.java4、去除有线网提示条目。5、效果UI&#xff…

微信小程序如何接入直播功能

一、小程序直播开通背景 1.政府资质要求 政府的要求,小程序开通直播需要注册主体具备互联网直播的资质,普通企业需要《信息网络传播视听节目许可证》,表演性质的直播需要《网络文化经营许可证》,政府主体需要《社会信用代码》及…

【Linux】MAC帧

目录 一、MAC帧 (一)IP地址和MAC地址 (二)MAC帧格式 (三)MTU对IP协议的影响、 (四)MTU对UDP协议的影响 (五)MTU对TCP协议的影响 二、以太网协议 &…

如何查看window电脑的GPU信息

GPU(图形处理器,Graphics Processing Unit)和显卡是两个密切相关但不同的概念 概念 1. ‌基本概念‌ ‌GPU‌:是专门用于处理图像和视频信息的微处理器,拥有强大的并行计算能力,主要负责图形渲染、数值分…

大数据判存算法

所谓的大数据判存算法,就是如何在海量数据中快速判断某个数据是否存在。这里用到的知识是布隆过滤器(Bloom Filter),下面按照 what - why - how 的顺序来学习它。 1、什么是布隆过滤器 布隆过滤器(英语:B…

Solr-搜索引擎-入门到精通

以下是对 Apache Solr 的简介及其常用语法的快速入门指南: 一、Solr 是什么? • 核心定位:Apache Solr 是一个基于 Lucene 的高性能、开源的搜索平台,支持全文检索、分词、高亮、聚合统计等功能。 • 核心功能: • 全…

Ajax与Axios,以及Apifox的入门使用

Ajax与Axios,以及Apifox的入门使用 作者:blue 时间:2025.3.20 文章目录 Ajax与Axios,以及Apifox的入门使用1.Ajax2.Axios3.Apifox的基本使用内容Path 参数定义语法用途 Query 参数定义语法用途 1.Ajax 概念:Asynchr…

Spring MVC拦截器

一、什么是拦截器 拦截器是 SpringMVC 提供的一种可以在请求处理过程中对请求进行预处理或后处理的机制。简单来说,拦截器就像是一位“守门员”,它拦住所有进来的请求,根据设定的规则决定是否放行或者进行某些操作。 拦截器可以&#xff1a…

mysql语句 聚合+分组+内外链接

1.聚合函数 1.count 记数 2.sum 求和 3.avg *语法:select avg(列名) from 表名; 4.max 求最大值 5.min 求最小值 求一个班级数学平均分? select avg(ifnull(math,0&#x…

WPF 与 C# 融合开发:从基础到高级应用(一)

WPF 与 C# 融合开发:从基础到高级应用 一、C# 语言基础回顾 1.1 C# 语言概述 C# 是微软开发的一种现代、面向对象的编程语言,它融合了 C、C 和 Java 等语言的优点,具有简洁、安全、高效等特点。C# 广泛应用于 Windows 平台的应用开发&…

【Linux】IP协议

目录 一、IP协议的概念 二、IP协议的报头 (一)IP协议报文的封装、解包和分用 (二)8位生存时间 (三)IP分片 三、IP协议的网段划分 (一)为什么需要网段划分 (二&am…

如何快速下载并安装 Postman?

从下载、安装、启动 Postman 这三个方面为大家详细讲解下载安装 Postman 每一步操作,帮助初学者快速上手。 Postman 下载及安装教程(2025最新)

计算机网络高频(三)UDP基础

计算机网络高频(三)UDP基础 1.UDP的头部格式是什么样的?⭐ UDP 头部具有以下字段: 源端口(Source Port):16 位字段,表示发送方的端口号。目标端口(Destination Port):16 位字段,表示接收方的端口号。长度(Length):16 位字段,表示 UDP 数据报(包括头部和数据部…

2024年MathorCup数学建模B题甲骨文智能识别中原始拓片单字自动分割与识别研究解题全过程文档加程序

2024年第十四届MathorCup高校数学建模挑战赛 B题 甲骨文智能识别中原始拓片单字自动分割与识别研究 原题再现: 甲骨文是我国目前已知的最早成熟的文字系统,它是一种刻在龟甲或兽骨上的古老文字。甲骨文具有极其重要的研究价值,不仅对中国文…

【深度学习的数学】导数

导数的定义。好像是从极限开始的。比如说,函数f(x)在点xa处的导数,就是当h趋近于0时,[f(ah) - f(a)]除以h的极限,对吧?公式应该是这样的:f’(a) lim_{h→0} [f(ah) - f(a)] / h。这个极限如果存在的话&…

word文件转换为Markdown格式

目录 一、前言1.1、poi-ooxml、docx4j、aspose-words对比二、poi-ooxml技术实现一、前言 顺应时代技术的变更及高效协同理念的影响,非结构化信息展示、存储、应用等也由传统文档向在线协同文档的演变,类似腾讯在线文档。   目前大多数在线文档支持的是Markdown格式,因此这…

【Hugging Face 开源库】Diffusers 库 —— 扩散模型

Diffusers 的三个主要组件1. DiffusionPipeline:端到端推理工具__call__ 函数callback_on_step_end 管道回调函数 2. 预训练模型架构和模块UNetVAE(Variational AutoEncoder)图像尺寸与 UNet 和 VAE 的关系EMA(Exponential Moving…

langserve搭建方法

文章目录 安装 langserver安装 langchain-cli创建langserve脚手架使用poetry管理包 安装 langserver pip install langserve安装 langchain-cli pip install langchain-cli创建langserve脚手架 langchain app new 项目名后续交互界面全回车,接着cd到 项目名 目录…

网络基础-路由器和交换机工作配置

三、路由器和交换机的工作原理配置以及华为体系下的小型网络的搭建 3.1路由基础 3.1.1数据转发 通过链路层交换机和网络层路由器进行数据转发 交换机(链路层)mac地址表的数据转发路由器(网络层) ip路由表的数据转发 隔离广播域…

mysql高级,mysql体系结构,mysql引擎,存储过程,索引,锁

1.mysql体系结构 1) 连接层 主要完成一些类似于连接处理、授权认证、及相关的安全方案。在该层上引入了线程池的概念,为通过认证安全接入的客户端提供线程。同样在该层上可以实现基于SSL的安全链接。服务器也会为安全接入的每个客户端验证它所具有的操作…