当前位置: 首页 > news >正文

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)
fs.writeFileSync(__dirname+ "/test.txt",  '在不同位置的命令行运行这个文件')

http://www.mrgr.cn/news/95966.html

相关文章:

  • 【408--复习笔记】计算机组成原理
  • 【模型压缩+推理加速】知识蒸馏综述解读
  • 嵌入式硬件工程师从小白到入门-原理图(三)
  • ofd转pdf报错:org.ofdrw.reader.ZipUtil.unZipFileByApacheCommonCompress【已解决】
  • 语言模型理论基础-持续更新-思路清晰
  • Vue 2 探秘:visible 和 append-to-body 是谁的小秘密?
  • Brainstorm绘制功能连接图(matlab)
  • vue - [Vue warn]: Duplicate keys detected: ‘0‘. This may cause an update error.
  • 第六篇:Setup:组件渲染前的初始化过程是怎样的?
  • 【Linux】交叉编译2
  • OpenCV图像拼接(5)图像拼接模块的用于创建权重图函数createWeightMap()
  • 嵌入式硬件工程师从小白到入门-PCB绘制(二)
  • 进程通信(进程池的模拟实现) read write函数复习 Linux ─── 第23课
  • 数据结构day04
  • python康复日记-request库的使用,爬虫自动化测试
  • 26考研——图_图的存储(6)
  • 26考研——图(6)
  • 2.基于多线程的TCP服务器实现
  • sql server如何提高索引命中率
  • 亚马逊云科技全面托管DeepSeek-R1模型现已上线