Node.js - 文件系统
欢迎,未来的程序员们!今天,我们将深入Node.js及其文件系统模块的精彩世界。作为你友好的邻里电脑老师,我将用大量的示例和解释来引导你完成这次旅程。所以,系好安全带,让我们开始吧!
同步与异步
在我们深入了解文件操作之前,让我们先讨论两个重要的概念:同步和异步操作。
想象你在一个咖啡店里。在一个同步的世界中,你会点一杯咖啡,等待它被制作好,然后继续下一项任务。在一个异步的世界中,你会点一杯咖啡,然后去做其他事情,同时咖啡师在准备你的咖啡。
在Node.js中,我们有同步和异步两种文件操作方法。让我们看一个例子:
const fs = require('fs');
// 同步读取
const data = fs.readFileSync('hello.txt', 'utf8');
console.log(data);
// 异步读取
fs.readFile('hello.txt', 'utf8', (err, data) => {
if (err) throw err;
console.log(data);
});
在同步版本中,我们的程序会等待文件被读取后才会继续执行。在异步版本中,它会在文件被读取时继续执行,然后在完成时运行一个回调函数。
写入文件
现在,让我们学习如何写入文件。这就像给你的未来自己留下一条信息!
const fs = require('fs');
// 同步写入
fs.writeFileSync('note.txt', '你好,未来的我!');
// 异步写入
fs.writeFile('note.txt', '你好,未来的我!', (err) => {
if (err) throw err;
console.log('文件已保存!');
});
在这两种情况下,我们都在创建(或覆盖)一个名为 'note.txt' 的文件,内容为 "你好,未来的我!"。异步版本包括一个在文件写入后运行的回调函数。
读取文件
读取文件就像打开你给自己留下的那条信息。让我们看看如何操作:
const fs = require('fs');
// 同步读取
const data = fs.readFileSync('note.txt', 'utf8');
console.log(data);
// 异步读取
fs.readFile('note.txt', 'utf8', (err, data) => {
if (err) throw err;
console.log(data);
});
这两种方法都会输出 'note.txt' 的内容。'utf8' 参数指定了文件的编码。
打开文件
有时,我们希望对文件有更多的控制。这时,open
方法就派上用场了:
const fs = require('fs');
// 异步打开
fs.open('myfile.txt', 'r', (err, fd) => {
if (err) throw err;
console.log('文件成功打开!');
// 记得在完成后关闭文件
fs.close(fd, (err) => {
if (err) throw err;
});
});
这将 'myfile.txt' 以读取模式('r')打开。回调中的 fd
是文件描述符,我们将用它对文件进行进一步操作。
Promises API
对于那些更喜欢使用Promises的人来说(如果你不知道这些是什么,不用担心!),Node.js为文件操作提供了一个基于Promise的API:
const fs = require('fs').promises;
async function readMyFile() {
try {
const data = await fs.readFile('myfile.txt', 'utf8');
console.log(data);
} catch (error) {
console.error('读取文件错误:', error);
}
}
readMyFile();
这和前面异步 readFile
示例达到同样的效果,但是使用了现代JavaScript语法。
获取文件信息
对文件的信息感兴趣吗?Node.js为你准备好了:
const fs = require('fs');
fs.stat('myfile.txt', (err, stats) => {
if (err) throw err;
console.log(`文件大小:${stats.size} 字节`);
console.log(`它是一个目录吗?${stats.isDirectory()}`);
console.log(`它是一个文件吗?${stats.isFile()}`);
});
这会给我们提供诸如文件大小、它是否是一个目录或文件等信息。
关闭文件
记住,当你完成文件操作时,总是要关闭文件。这就像把牙膏盖子放回去一样!
const fs = require('fs');
fs.open('myfile.txt', 'r', (err, fd) => {
if (err) throw err;
// 进行一些操作...
fs.close(fd, (err) => {
if (err) throw err;
console.log('文件成功关闭');
});
});
截断文件
有时你想要保留文件,但删除其内容。这时,截断操作就派上用场了:
const fs = require('fs');
fs.truncate('myfile.txt', 0, (err) => {
if (err) throw err;
console.log('文件内容已清除!');
});
这将文件减少到0字节,实际上清除了其内容。
删除文件
当你完全不再需要文件时,你可以删除它:
const fs = require('fs');
fs.unlink('myfile.txt', (err) => {
if (err) throw err;
console.log('文件成功删除');
});
使用这个操作时要小心——现实生活中没有撤销按钮!
创建目录
需要一个新文件夹?下面是如何创建一个:
const fs = require('fs');
fs.mkdir('mynewfolder', (err) => {
if (err) throw err;
console.log('目录成功创建!');
});
读取目录
想要查看目录中的内容?下面是如何操作:
const fs = require('fs');
fs.readdir('.', (err, files) => {
if (err) throw err;
console.log('目录内容:');
files.forEach(file => {
console.log(file);
});
});
这会列出当前目录中的所有文件和子目录。
删除目录
最后,如果你想要删除一个目录:
const fs = require('fs');
fs.rmdir('mynewfolder', (err) => {
if (err) throw err;
console.log('目录成功删除');
});
注意,这只能用于空目录。
方法参考
以下是我们在本文中介绍的方法的便捷表格:
方法 | 描述 |
---|---|
readFile | 读取文件的完整内容 |
writeFile | 将数据写入文件,如果文件已存在,则替换文件 |
open | 打开一个文件进行读取或写入 |
close | 关闭一个文件描述符 |
stat | 获取关于文件的信息 |
truncate | 将文件截断到指定的长度 |
unlink | 删除一个文件 |
mkdir | 创建一个新的目录 |
readdir | 读取一个目录的内容 |
rmdir | 删除一个目录 |
就是这样!你现在掌握了Node.js文件系统操作的基础。记住,熟能生巧,所以不要害怕用这些方法进行实验。快乐编码!
Credits: Image by storyset