fs
是file system
的缩写。其为Node.js
的核心模块之一,用于对文件系统进行操作。它提供了丰富的函数,可对文件进行读取、写入、复制和删除操作,同时也支持对目录进行创建、遍历和修改等操作。
文件写入即将数据保存至文件中,fs
模块提供了多种方法实现:
方法 | 说明 |
---|---|
write |
异步写入 |
writeSync |
异步写入 |
writeFile |
异步写入 |
writeFileSync |
同步写入 |
appendFile |
异步追加写入 |
appendFileSync |
同步追加写入 |
createWriteStream |
流式写入 |
Node.js
中提供了三种write
异步写入的函数:
fs.write(fd, buffer[, options], callback)
参数说明:
fs.write(fd, buffer, offset[, length[, position]], callback)
参数说明:
fs.write(fd, string[, position[, encoding]], callback)
参数说明:
const fs = require('fs')
fs.open('./fs_file.txt', 'r+', (err, fd) => {
if (err) {
return console.error("打开文件失败:" + err.message)
}
// 异步写入
fs.write(fd, "烹羊宰牛且为乐,会须一饮三百杯。", 10, (err, writeBytes, buffer) => {
if (err) {
return console.error("文件写入失败:" + err.message)
}
console.log("成功写入字节数:" + writeBytes)
console.log("成功写入文件内容:" + buffer.toString())
})
})
console.log("主线程执行完毕")
Node.js
中提供了三种write
异步写入的函数:
fs.write(fd, buffer[, options]) // 返回写入字节数
参数说明:
fs.write(fd, buffer, offset[, length[, position]]) // 返回写入字节数
参数说明:
fs.write(fd, string[, position[, encoding]]) // 返回写入字节数
参数说明:
const fs = require('fs')
fs.open('./fs_file.txt', 'r+', (err, fd) => {
if (err) {
return console.error("打开文件失败:" + err.message)
}
// 同步写入
var writeBytes = fs.writeSync(fd, "烹羊宰牛且为乐,会须一饮三百杯。", 20)
console.log("成功写入字节数:" + writeBytes)
})
console.log("主线程执行完毕")
fs.writeFile(file, data[, options], callback)
参数说明:
fs.fsync()
刷新数据。默认为false
const fs = require('fs')
// 异步写入
fs.writeFile('./fs_file.txt', "天生我才必有用", (err) => {
// 若写入失败时,调用回调函数时,会传入错误对象;写入成功,会传入 null
if (err) {
return console.error("文件写入失败:" + err.message)
}
console.log("写入完毕")
})
console.log("主线程执行完毕")
fs.writeFileSync()
参数说明:
fs.fsyncSync()
刷新数据const fs = require('fs')
// 同步写入
fs.writeFileSync('./fs_fileSync.txt', "天生我才必有用")
console.log("主线程执行完毕")
fs.appendFile(file, data[, options], callback)
参数说明:
// 异步追加写入
const fs = require('fs')
fs.appendFile('./fs_file.txt', ",千金散尽还复来", (err) => {
// 若写入失败时,调用回调函数时,会传入错误对象;写入成功,会传入 null
if (err) {
return console.error("文件追加写入失败:" + err.message)
}
console.log("追加写入完毕")
})
console.log("主线程执行完毕")
fs.appendFileSync(file, data[, options])
参数说明:
const fs = require('fs')
// 同步写入
fs.appendFileSync('./fs_fileSync.txt', ",千金散尽还复来")
console.log("主线程执行完毕")
fs.createWriteStream(file[, options]) // 返回一个写入流对象
const fs = require('fs')
const out = fs.createWriteStream('./fs_stream.txt')
out.write("天生我才必有用")
out.write("千金散尽还复来")
out.end()
console.log("主线程执行完毕")
文件读取就是通过程序取出文件中的数据,,fs
模块提供了多种方法实现:
方法 | 说明 |
---|---|
read |
异步读取 |
readSync |
同步读取 |
readFile |
异步读取 |
readFileSync |
同步读取 |
createReadStream |
流式读取 |
Node.js
中提供了三种read
异步读取的函数:
fs.read(fd[, options], callback)
参数说明:
fs.read(fd, buffer[, options], callback)
参数说明:
fs.read(fd, buffer, offset, length, position, callback)
参数说明:
const fs = require('fs')
fs.open('./fs_file.txt', 'r+', (err, fd) => {
if (err) {
return console.error("打开文件失败:" + err.message)
}
const buf = Buffer.alloc(1024)
// 异步读取
fs.read(fd, buf, 0, buf.length, 0, (err, readBytes, buffer) => {
if (err) {
return console.error("读取文件失败:" + err.message)
}
console.log("成功读取文件字节数:" + readBytes)
console.log("成功读取文件内容:" + buffer.toString())
})
})
console.log("主线程执行完毕")
Node.js
中提供了三种read
同步读取的函数:
fs.readSync(fd[, options]) // 返回 bytesRead 的数量
参数说明:
fs.readSync(fd, buffer[, options]) // 返回 bytesRead 的数量
参数说明:
fs.readSync(fd, buffer, offset, length, position) // 返回 bytesRead 的数量
参数说明:
const fs = require('fs')
fs.open('./fs_file.txt', 'r+', (err, fd) => {
if (err) {
return console.error("打开文件失败:" + err.message)
}
const buf = Buffer.alloc(1024)
// 同步读取
var byteReads = fs.readSync(fd, buf, 0, buf.length, 0)
console.log("成功读取文件字节数:" + byteReads)
console.log("成功读取文件内容:" + buf.toString())
})
console.log("主线程执行完毕")
fs.readFile(path[, options], callback)
参数说明:
const fs = require('fs')
// 异步读取文件
fs.readFile('./fs_file.txt', (err, data) => {
if (err) {
return console.error("读取文件失败:" + err.message)
}
console.log("成功读取文件内容:" + data)
})
console.log("主线程执行完毕")
fs.readFileSync(path[, options]) // 返回 读取的文件内容
参数说明:
const fs = require('fs')
// 同步读取文件
const data = fs.readFileSync('./fs_fileSync.txt')
console.log("成功读取文件内容:" + data)
console.log("主线程执行完毕")
fs.createReadStream([options]) // 返回一个读取流对象
参数说明:
fs.readFile()
是对fs.read()
的进一步封装,fs.readFile()
可以更方便的读取文件内容fs.read()
比fs.readFile()
读取文件内容可操作性更强。使用fs.read()
读取文件,首先需要用fs.stat()
判断文件的大小,然后使用fs.open()
创建文件描述符,最后再使用fs.read()
读取文件内容Node.js
中可对文件进行重命名或移动,fs
模块提供了多种方法实现:
方法 | 说明 |
---|---|
rename |
异步重命名或移动 |
renameSync |
同步重命名或移动 |
fs.rename(oldPath, newPath, callback)
参数说明:
const fs = require('fs')
// 异步移动或重命名文件、
fs.rename('./Node.txt', './node.txt', (err) => {
if (err) {
console.error("异步移动或重命名文件失败:" + err.message)
}
})
console.log("主线程执行完毕")
fs.renameSync(oldPath, newPath)
参数说明:
const fs = require('fs')
// 同步移动或重命名文件
fs.renameSync('./node.txt', './Node.txt')
console.log("主线程执行完毕")
Node.js
中可对文件进行截取,fs
模块提供了多种方法实现:
方法 | 说明 |
---|---|
ftruncate |
异步截取 |
ftruncateSync |
同步截取 |
fs.ftruncate(fd[, len], callback)
参数说明:
const fs = require('fs')
// 打开文件
fs.open('./fs_file.txt', 'r+', (err, fd) => {
if (err) {
return console.error("文件打开失败:" + err.message);
}
console.log("文件打开成功!");
// 异步 截取 10字节 内的文件内容,超出部分将被去除
fs.ftruncate(fd, 10, (err) => {
if (err) {
return console.error("截取文件内容失败:" + err.message);
}
console.log("文件截取成功!");
fs.close(fd, (err) => {
if (err) {
return console.error("文件关闭失败:" + err.message);
}
console.log("文件关闭成功!");
})
})
})
fs.ftruncateSync(fd[, len])
参数说明:
// 打开文件
const fs = require('fs')
fs.open('./fs_fileSync.txt', 'r+', (err, fd) => {
if (err) {
return console.error("文件打开失败:" + err.message);
}
console.log("文件打开成功!");
// 同步 截取 10字节 内的文件内容,超出部分将被去除
fs.ftruncateSync(fd, 10)
fs.close(fd, (err) => {
if (err) {
return console.error("文件关闭失败:" + err.message);
}
console.log("文件关闭成功!");
})
})
console.log("主线程执行完毕")
Node.js
中可对文件或符号链接进行删除,fs
模块提供了多种方法实现:
方法 | 说明 |
---|---|
unlink |
异步删除 |
unlinkSync |
同步删除 |
const fs = require('fs')
// 异步删除文件
fs.unlink('./fs_file_bak.txt', (err) => {
if (err) {
console.error("删除文件失败:" + err.message)
}
})
console.log("主线程执行完毕")
fs.unlink(path, callback)
参数说明:
fs.unlink(path)
参数说明:
const fs = require('fs')
// 同步删除文件
fs.unlinkSync('./fs_file_bak.txt')
console.log("主线程执行完毕")
Node.js
中提供了打开文件的操作,fs
模块提供了多种方法实现:
方法 | 说明 |
---|---|
open |
异步打开 |
openSync |
同步打开 |
fs.open(path, flag[, mode], callback)
参数说明:
const fs = require('fs')
// 异步打开文件
fs.open('./fs_file.txt', 'r', (err, fd) => {
if (err) {
console.error("打开文件失败:" + err.message)
}
console.log("打开文件成功:" + fd)
})
console.log("主线程执行完毕")
fs.open(path, flag[, mode]) // 返回文件描述符
参数说明:
const fs = require('fs')
// 同步打开文件
fs.openSync('./fs_file.txt', 'r')
console.log("主线程执行完毕")
Node.js
中提供了关闭文件的操作,fs
模块提供了多种方法实现:
方法 | 说明 |
---|---|
close |
异步关闭 |
closeSync |
同步关闭 |
fs.close(fd, callback)
参数说明:
const fs = require('fs')
// 异步打开文件
fs.open('./fs_file.txt', 'r', (err, fd) => {
if (err) {
console.error("打开文件失败:" + err.message)
}
// 异步关闭
fs.close(fd, (err) => {
if (err) {
console.error("关闭文件失败:" + err.message)
}
})
})
console.log("主线程执行完毕")
fs.closeSync(fd, callback)
参数说明:
const fs = require('fs')
// 异步打开文件
fs.open('./fs_file.txt', 'r', (err, fd) => {
if (err) {
console.error("打开文件失败:" + err.message)
}
// 同步关闭
fs.closeSync(fd)
})
console.log("主线程执行完毕")
Node.js
中提供了多种创建文件夹的操作,fs
模块提供了多种方法实现:
方法 | 说明 |
---|---|
mkdir |
异步创建 |
mkdirSync |
同步创建 |
fs.mkdir(path[, options], callback)
参数说明:
const fs = require('fs')
// 异步创建文件夹
fs.mkdir('./abc', { recursive: true }, (err, path) => {
if (err) {
return console.error("创建文件夹失败:" + err.message)
}
console.log(path)
})
fs.mkdirSync(path[, options]) // 返回 undefined 或 第一层目录的绝对路径(仅当创建目录时将 recursive 设置为 true返回)
参数说明:
const fs = require('fs')
// 同步创建文件夹
var path = fs.mkdirSync('./xyz', { recursive: true })
console.log(path)
Node.js
中提供了多种读取文件夹的操作,fs
模块提供了多种方法实现:
方法 | 说明 |
---|---|
readdir |
异步读取 |
readdirSync |
同步读取 |
fs.readdir(path[, options], callback)
参数说明:
const fs = require('fs')
// 异步读取文件夹
fs.readdir('../', { encoding: 'utf8', withFileTypes: true, recursive: true }, (err, files) => {
if (err) {
console.error("读取文件夹失败:" + err.message)
}
console.log(files)
})
fs.readdirSync(path[, options]) // 返回目录列表
参数说明:
const fs = require('fs')
// 同步读取文件夹
var files = fs.readdirSync('../', { encoding: 'utf8', withFileTypes: true, recursive: true })
console.log(files)
Node.js
中提供了多种删除和文件夹的操作,fs
模块提供了多种方法实现:
方法 | 说明 |
---|---|
rm |
异步删除 |
rmSync |
同步删除 |
fs.rm(path[, options], callback)
参数说明:
已弃用
const fs = require('fs')
// 异步删除文件或文件夹
fs.rm('./x', { force: true, maxRetries: 3, recursive: true, retryDelay: 200 }, (err) => {
if (err) {
console.log("删除文件夹失败:" + err.message)
}
})
fs.rmSync(path[, options])
参数说明:
已弃用
const fs = require('fs')
// 同步删除文件或文件夹
fs.rmSync('./x', { force: true, maxRetries: 3, recursive: true, retryDelay: 10 })
console.log(xx)
Node.js
中提供了获取资源信息的操作,fs
模块提供了多种方法实现:
方法 | 说明 |
---|---|
stat |
异步获取 |
statSync |
同步获取 |
fs.stat(path[, options], callback)
参数说明:
stats类中的方法
方法 | 描述 |
---|---|
stats.isFile() |
判断是否为 文件 |
stats.isDirectory |
判断是否为 目录 |
stats.isBlockDevice() |
判断是否为 块设备 |
stats.isCharacterDevice() |
判断是否为 字符设备 |
stats.isSymbolicLink() |
判断是否为 软链接 |
stats.isFIFO |
判断是否为 FIFO(FIFO是 UNIX 中的一种特殊的命令管道) |
stats.isSocket |
判断是否为 socket |
const fs = require('fs')
// 异步获取文件信息
fs.stat('./fs_file.txt', (err, stats) => {
if (err) {
return console.error("获取文件信息失败:" + err.message)
}
console.log(stats)
// 检查文件属性
console.log(stats.isFile())
})
console.log("主线程执行完毕")
fs.stat(path[, options]) // 返回 stats 对象
参数说明:
stats类中的方法
方法 | 描述 |
---|---|
stats.isFile() |
判断是否为 文件 |
stats.isDirectory |
判断是否为 目录 |
stats.isBlockDevice() |
判断是否为 块设备 |
stats.isCharacterDevice() |
判断是否为 字符设备 |
stats.isSymbolicLink() |
判断是否为 软链接 |
stats.isFIFO |
判断是否为 FIFO(FIFO是 UNIX 中的一种特殊的命令管道) |
stats.isSocket |
判断是否为 socket |
const fs = require('fs')
// 异步获取文件信息
var stats = fs.statSync('./fs_file.txt')
console.log(stats)
console.log("主线程执行完毕")
fs模块对资源进行操作时,路径有两种写法:
./
表示当前目录(省略该符号也表示当前目录)。例:./data.txt 表示当前目录下的data.txt文件../
表示当前目录的上一级目录。例:…/data.txt 表示当前目录的上级目录下的data.txt文件注意:
相对路径中的当前目录
指的是 命令行的工作目录,而非文件的所在目录。所以当命令行的工作目录与文件所在的目录不一致时,会出现以下BUG。
__dirname
表示当前文件所在目录的绝对路径。
在使用 fs 模块的时候,尽量使用 __dirname 将路径转换为绝对路径,这样可避免相对路径产生的bug
将当前目录下的文件 data.txt 拷贝到 data_bak.txt 中
const fs = require('fs')
fs.readFile('./data.txt', (err, data) => {
if (err) {
console.error("读取文件失败:" + err.message)
}
console.log("成功读取到文件内容:" + data)
fs.writeFile('./data_bak.txt', data, (err) => {
if (err) {
console.error("写入文件失败:" + err.message)
}
console.log("成功写入内容")
})
})