nodejs -- fs
Node.js 的 fs(File System)模块是一个内置模块,用于与文件系统进行交互,支持各种操作,如读取、写入、更新、删除文件以及创建和管理目录等。它提供了同步和异步的 API,允许开发者操作文件和目录。
1. 引入 fs 模块
在 Node.js 中,要使用 fs 模块,首先需要引入它:
const fs = require('fs');
2. fs 模块的操作方式
Node.js 的 fs 模块提供了两种操作方式:
1.同步 (Blocking): 阻塞式方法会等待文件操作完成后才会继续执行后续代码。
2.异步 (Non-blocking): 非阻塞式方法会立即返回,并通过回调函数提供操作结果。
3. 文件读取
异步读取文件:fs.readFile()
该方法用于读取文件内容。它是异步的,读取完成后会通过回调函数返回结果。
fs.readFile('example.txt', 'utf8', (err, data) => {
if (err) {
console.error('Error reading file:', err);
return;
}
console.log('File content:', data);
});
3.第一个参数是文件路径。
4.第二个参数是可选的编码(例如 'utf8'),如果未指定,返回的是 Buffer。
5.第三个参数是回调函数,接受两个参数:err(错误)和 data(文件内容)。
同步读取文件:fs.readFileSync()
与异步方法类似,但它是阻塞的,操作完成后会返回文件内容。
try {
const data = fs.readFileSync('example.txt', 'utf8');
console.log('File content:', data);
} catch (err) {
console.error('Error reading file:', err);
}
4. 文件写入
异步写入文件:fs.writeFile()
此方法用于将数据写入到文件。如果文件存在,它会覆盖文件内容;如果文件不存在,则会创建一个新文件。
fs.writeFile('example.txt', 'Hello, Node.js!', 'utf8', (err) => {
if (err) {
console.error('Error writing to file:', err);
return;
}
console.log('File has been written');
});
6.第一个参数是文件路径。
7.第二个参数是要写入的数据。
8.第三个参数是编码(例如 'utf8')。
9.第四个参数是回调函数,处理写入后的错误。
同步写入文件:fs.writeFileSync()
与异步方法类似,但它是阻塞的,操作完成后会返回结果。
try {
fs.writeFileSync('example.txt', 'Hello, Node.js!', 'utf8');
console.log('File has been written');
} catch (err) {
console.error('Error writing to file:', err);
}
5. 追加数据到文件
异步追加:fs.appendFile()
该方法将数据附加到文件末尾。如果文件不存在,会自动创建文件。
fs.appendFile('example.txt', ' Appended text!', 'utf8', (err) => {
if (err) {
console.error('Error appending to file:', err);
return;
}
console.log('Data has been appended');
});
同步追加:fs.appendFileSync()
与 appendFile 相同,但它是阻塞的。
try {
fs.appendFileSync('example.txt', ' Appended text!', 'utf8');
console.log('Data has been appended');
} catch (err) {
console.error('Error appending to file:', err);
}
-
文件删除
异步删除文件:fs.unlink()
此方法用于删除文件。fs.unlink('example.txt', (err) => {
if (err) {
console.error('Error deleting file:', err);
return;
}
console.log('File has been deleted');
});
同步删除文件:fs.unlinkSync()
与异步方法类似,但它是阻塞的。
try {
fs.unlinkSync('example.txt');
console.log('File has been deleted');
} catch (err) {
console.error('Error deleting file:', err);
}
7. 文件重命名
异步重命名:fs.rename()
此方法用于重命名或移动文件。
fs.rename('oldname.txt', 'newname.txt', (err) => {
if (err) {
console.error('Error renaming file:', err);
return;
}
console.log('File has been renamed');
});
同步重命名:fs.renameSync()
与异步方法类似,但它是阻塞的。
try {
fs.renameSync('oldname.txt', 'newname.txt');
console.log('File has been renamed');
} catch (err) {
console.error('Error renaming file:', err);
}
8. 检查文件是否存在
fs.existsSync()
此方法检查文件或目录是否存在,返回布尔值(true 或 false)。
if (fs.existsSync('example.txt')) {
console.log('File exists');
} else {
console.log('File does not exist');
}
异步检查文件存在:fs.access()
此方法检查文件或目录是否可访问,并通过回调函数报告结果。
fs.access('example.txt', fs.constants.F_OK, (err) => {
if (err) {
console.error('File does not exist');
} else {
console.log('File exists');
}
});
9. 创建和删除目录
创建目录:fs.mkdir() / fs.mkdirSync()
创建新目录。
fs.mkdir('newDirectory', (err) => {
if (err) {
console.error('Error creating directory:', err);
return;
}
console.log('Directory created');
});
删除目录:fs.rmdir() / fs.rmdirSync()
删除空目录。
fs.rmdir('newDirectory', (err) => {
if (err) {
console.error('Error removing directory:', err);
return;
}
console.log('Directory removed');
});
10. 文件系统常量
Node.js 提供了一些常量用于文件操作中的权限和状态标识。例如:
10.fs.constants.F_OK:检查文件是否存在。
11.fs.constants.R_OK:检查文件是否可读取。
12.fs.constants.W_OK:检查文件是否可写入。
13.fs.constants.X_OK:检查文件是否可执行。
11. fs 模块的异步与同步版本
Node.js 中的 fs 模块提供了对应的同步和异步方法。异步方法通常会接受回调函数,处理完成后返回结果;同步方法则会阻塞代码执行直到操作完成。通常建议使用异步方法,以提高性能和避免阻塞事件循环。
12. fs.promises API
从 Node.js v10 起,fs.promises 提供了一套基于 Promise 的 API,适用于异步操作。示例如下:
const fsPromises = fs.promises;
async function readFile() {
try {
const data = await fsPromises.readFile('example.txt', 'utf8');
console.log('File content:', data);
} catch (err) {
console.error('Error reading file:', err);
}
}
通过 fs.promises,你可以使用 async/await 进行文件操作,更加简洁和易于管理异步代码。