面试题答案
一键面试在Node.js中,可以使用fs.watch()
或fs.watchFile()
方法来监听文件的更改事件。以下是使用fs.watch()
的示例:
const fs = require('fs');
const filePath = 'example.txt';
// 使用fs.watch监听文件更改事件
const watcher = fs.watch(filePath, (eventType, filename) => {
if (eventType === 'change') {
console.log(`${filename} has been changed`);
// 处理文件内容变化
fs.readFile(filePath, 'utf8', (err, data) => {
if (err) {
console.error('Error reading file:', err);
return;
}
console.log('New file content:', data);
// 这里可以对新的文件内容进行进一步处理
});
}
});
// 当不再需要监听时,可以停止监听
// watcher.close();
在上述示例中:
- 引入
fs
模块。 - 使用
fs.watch()
方法监听指定文件路径example.txt
。fs.watch()
的第一个参数为要监听的文件路径,第二个参数是一个回调函数,回调函数接收两个参数:eventType
(事件类型,如change
表示文件内容或元数据发生改变)和filename
(发生改变的文件名)。 - 当监听到
change
事件时,使用fs.readFile()
读取文件内容,读取成功后可以对文件内容进行处理。
fs.watchFile()
方法的使用方式稍有不同,示例如下:
const fs = require('fs');
const filePath = 'example.txt';
// 获取文件初始状态
const stats = fs.statSync(filePath);
let prevModifiedTime = stats.mtime;
// 使用fs.watchFile监听文件更改事件
fs.watchFile(filePath, (curr, prev) => {
if (curr.mtime.getTime()!== prev.mtime.getTime()) {
console.log('File has been changed');
// 处理文件内容变化
fs.readFile(filePath, 'utf8', (err, data) => {
if (err) {
console.error('Error reading file:', err);
return;
}
console.log('New file content:', data);
// 这里可以对新的文件内容进行进一步处理
});
}
});
在这个示例中:
- 同样引入
fs
模块。 - 使用
fs.statSync()
获取文件初始状态,记录初始的修改时间prevModifiedTime
。 - 使用
fs.watchFile()
监听文件,回调函数接收两个参数curr
(当前文件状态)和prev
(之前的文件状态),通过比较修改时间来判断文件是否发生改变,若发生改变则读取文件内容并处理。
需要注意的是,fs.watchFile()
相对fs.watch()
性能较低,因为它会轮询文件系统检查文件变化,而fs.watch()
基于操作系统的文件系统通知机制,效率更高,通常推荐使用fs.watch()
。