Node.js 的文件系统(File System, fs
)模块允许你与文件和目录进行交互。fs
模块提供了很多方法来操作文件和目录,包括读取、写入、删除、重命名文件和目录等。fs
模块中的方法有同步和异步版本。异步方法更常用,因为它们不会阻塞事件循环。
fs
模块在使用 fs
模块之前,需要先引入它:
const fs = require('fs');
以下是 Node.js fs
模块中的一些常用方法及其详细说明:
fs.readFile(path[, options], callback)
异步读取文件的内容。
path
: 字符串或 Buffer,文件的路径。options
: 对象(可选),可以指定编码(如 'utf8'
)和标志(如 'r'
读取模式)。callback
: 回调函数,格式为 (err, data)
,data
是读取的文件内容。示例:
fs.readFile('example.txt', 'utf8', (err, data) => {
if (err) throw err;
console.log(data);
});
fs.readFileSync(path[, options])
同步读取文件的内容。
path
: 字符串或 Buffer,文件的路径。options
: 对象(可选),可以指定编码(如 'utf8'
)和标志(如 'r'
读取模式)。示例:
try {
const data = fs.readFileSync('example.txt', 'utf8');
console.log(data);
} catch (err) {
console.error(err);
}
fs.writeFile(file, data[, options], callback)
异步写入文件。如果文件已存在,则覆盖该文件。
file
: 字符串或 Buffer,文件的路径。data
: 字符串或 Buffer,要写入的数据。options
: 对象(可选),可以指定编码(如 'utf8'
)和标志(如 'w'
写入模式)。callback
: 回调函数,格式为 (err)
。示例:
fs.writeFile('example.txt', 'Hello, world!', (err) => {
if (err) throw err;
console.log('File has been saved!');
});
fs.writeFileSync(file, data[, options])
同步写入文件。如果文件已存在,则覆盖该文件。
file
: 字符串或 Buffer,文件的路径。data
: 字符串或 Buffer,要写入的数据。options
: 对象(可选),可以指定编码(如 'utf8'
)和标志(如 'w'
写入模式)。示例:
try {
fs.writeFileSync('example.txt', 'Hello, world!');
console.log('File has been saved!');
} catch (err) {
console.error(err);
}
fs.appendFile(file, data[, options], callback)
异步追加数据到文件。如果文件不存在,则创建文件。
file
: 字符串或 Buffer,文件的路径。data
: 字符串或 Buffer,要追加的数据。options
: 对象(可选),可以指定编码(如 'utf8'
)和标志(如 'a'
追加模式)。callback
: 回调函数,格式为 (err)
。示例:
fs.appendFile('example.txt', 'Hello again!', (err) => {
if (err) throw err;
console.log('Data has been appended!');
});
fs.appendFileSync(file, data[, options])
同步追加数据到文件。如果文件不存在,则创建文件。
file
: 字符串或 Buffer,文件的路径。data
: 字符串或 Buffer,要追加的数据。options
: 对象(可选),可以指定编码(如 'utf8'
)和标志(如 'a'
追加模式)。示例:
try {
fs.appendFileSync('example.txt', 'Hello again!');
console.log('Data has been appended!');
} catch (err) {
console.error(err);
}
fs.rename(oldPath, newPath, callback)
异步重命名文件或目录。
oldPath
: 字符串或 Buffer,当前文件或目录的路径。newPath
: 字符串或 Buffer,新文件或目录的路径。callback
: 回调函数,格式为 (err)
。示例:
fs.rename('oldName.txt', 'newName.txt', (err) => {
if (err) throw err;
console.log('File has been renamed!');
});
fs.renameSync(oldPath, newPath)
同步重命名文件或目录。
oldPath
: 字符串或 Buffer,当前文件或目录的路径。newPath
: 字符串或 Buffer,新文件或目录的路径。示例:
try {
fs.renameSync('oldName.txt', 'newName.txt');
console.log('File has been renamed!');
} catch (err) {
console.error(err);
}
fs.unlink(path, callback)
异步删除文件。
path
: 字符串或 Buffer,文件的路径。callback
: 回调函数,格式为 (err)
。示例:
fs.unlink('example.txt', (err) => {
if (err) throw err;
console.log('File has been deleted!');
});
fs.unlinkSync(path)
同步删除文件。
path
: 字符串或 Buffer,文件的路径。示例:
try {
fs.unlinkSync('example.txt');
console.log('File has been deleted!');
} catch (err) {
console.error(err);
}
fs.stat(path, callback)
异步获取文件的状态信息。
path
: 字符串或 Buffer,文件的路径。callback
: 回调函数,格式为 (err, stats)
。stats
是一个 fs.Stats
对象,提供文件的信息(如大小、创建时间等)。
示例:
fs.stat('example.txt', (err, stats) => {
if (err) throw err;
console.log(stats);
});
fs.statSync(path)
同步获取文件的状态信息。
path
: 字符串或 Buffer,文件的路径。示例:
try {
const stats = fs.statSync('example.txt');
console.log(stats);
} catch (err) {
console.error(err);
}
fs.mkdir(path[, options], callback)
异步创建目录。
path
: 字符串或 Buffer,新目录的路径。options
: 对象(可选),可以指定 recursive
(递归创建)和 mode
(权限)等选项。callback
: 回调函数,格式为 (err)
。示例:
fs.mkdir('newDir', { recursive: true }, (err) => {
if (err) throw err;
console.log('Directory created!');
});
fs.mkdirSync(path[, options])
同步创建目录。
path
: 字符串或 Buffer,新目录的路径。options
: 对象(可选),可以指定 recursive
(递归创建)和 mode
(权限)等选项。示例:
try {
fs.mkdirSync('newDir', { recursive: true });
console.log('Directory created!');
} catch (err) {
console.error(err);
}
fs.rmdir(path[, options], callback)
异步删除目录。要删除的目录必须为空。
path
: 字符串或 Buffer,目录的路径。options
: 对象(可选),可以指定 recursive
(递归删除)等选项(从 Node.js12.10.0 开始)。
callback
: 回调函数,格式为 (err)
。示例:
fs.rmdir('newDir', (err) => {
if (err) throw err;
console.log('Directory removed!');
});
fs.rmdirSync(path[, options])
同步删除目录。要删除的目录必须为空。
path
: 字符串或 Buffer,目录的路径。options
: 对象(可选),可以指定 recursive
(递归删除)等选项(从 Node.js 12.10.0 开始)。示例:
try {
fs.rmdirSync('newDir');
console.log('Directory removed!');
} catch (err) {
console.error(err);
}
fs.readdir(path[, options], callback)
异步读取目录的内容。
path
: 字符串或 Buffer,目录的路径。options
: 对象(可选),可以指定 encoding
(编码)等选项。callback
: 回调函数,格式为 (err, files)
,files
是目录中内容的数组。示例:
fs.readdir('.', (err, files) => {
if (err) throw err;
console.log(files);
});
fs.readdirSync(path[, options])
同步读取目录的内容。
path
: 字符串或 Buffer,目录的路径。options
: 对象(可选),可以指定 encoding
(编码)等选项。示例:
try {
const files = fs.readdirSync('.');
console.log(files);
} catch (err) {
console.error(err);
}
fs.copyFile(src, dest[, mode], callback)
异步复制文件。
src
: 字符串或 Buffer,源文件的路径。dest
: 字符串或 Buffer,目标文件的路径。mode
: 整数(可选),指定文件复制的行为,可以是 fs.constants.COPYFILE_EXCL
或 fs.constants.COPYFILE_FICLONE
。callback
: 回调函数,格式为 (err)
。示例:
fs.copyFile('source.txt', 'destination.txt', (err) => {
if (err) throw err;
console.log('File copied!');
});
fs.copyFileSync(src, dest[, mode])
同步复制文件。
src
: 字符串或 Buffer,源文件的路径。dest
: 字符串或 Buffer,目标文件的路径。mode
: 整数(可选),指定文件复制的行为,可以是 fs.constants.COPYFILE_EXCL
或 fs.constants.COPYFILE_FICLONE
。示例:
try {
fs.copyFileSync('source.txt', 'destination.txt');
console.log('File copied!');
} catch (err) {
console.error(err);
}
fs.watch(filename[, options], listener)
监视文件或目录的变化。
filename
: 字符串或 Buffer,要监视的文件或目录的路径。options
: 对象(可选),可以指定 persistent
(是否持续监视)、recursive
(是否递归监视子目录)等选项。listener
: 回调函数,格式为 (eventType, filename)
,当文件或目录变化时被调用。示例:
fs.watch('example.txt', (eventType, filename) => {
console.log(`File ${filename} changed with event type ${eventType}`);
});
Node.js 的 fs
模块提供了丰富的文件系统操作方法,包括文件读写、目录操作和文件监视等。了解这些方法的同步和异步版本以及各自的使用场景,可以帮助你在 Node.js 应用程序中高效地进行文件和目录操作。无论是简单的文件读写,还是复杂的文件系统监视,fs
模块都是一个强大的工具。