Node.js - 文件系统

欢迎,未来的程序员们!今天,我们将深入Node.js及其文件系统模块的精彩世界。作为你友好的邻里电脑老师,我将用大量的示例和解释来引导你完成这次旅程。所以,系好安全带,让我们开始吧!

Node.js - File System

同步与异步

在我们深入了解文件操作之前,让我们先讨论两个重要的概念:同步和异步操作。

想象你在一个咖啡店里。在一个同步的世界中,你会点一杯咖啡,等待它被制作好,然后继续下一项任务。在一个异步的世界中,你会点一杯咖啡,然后去做其他事情,同时咖啡师在准备你的咖啡。

在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