使用 Javascript 创建后端(3):NodeJS 文件和文件夹操作

NodeJS 附带了几个模块,这些模块的功能可让你轻松执行最常见的任务。

稍后你将看到,还可以添加社区创建的其他模块,并几乎无限地扩展应用程序的功能。

在这里,我将仅向你介绍 NodeJS 模块的几个示例。你可以查阅 NodeJS 文档,了解模块的完整详细信息及其工作原理。https://nodejs.org/en/docs/

路径模块

path 模块包含允许正确处理文件夹和文件位置的功能

要引用模块,只需使用其名称

1
2
3
4
5
6
const path = require("path");

products_path = "/data/products/products.json";
products_file = path.basename(products_path);

console.log(products_file); // products.json

path.basename() 函数允许你仅返回文件的名称,因此在本例中为“products.json”

另一个方便的函数是 path.join()。此函数允许你将一个或多个文件夹和文件连接在一起。示例:

1
2
3
4
5
6
7
8
9
const path = require("path");

data_folder = "/data/";
products_folder = "/products";
products_file = "products.json";

const full_path = path.join(data_folder, products_folder, products_file);

console.log(full_path); // /data/products/products.json

path.join() 使用特定于平台的分隔符作为分隔符将所有给定的路径段连接在一起,然后规范化生成的路径

最后,有时你希望在服务器上拥有绝对路径

1
2
3
4
5
6
7
8
9
10
11
12
const path = require("path");

data_folder = "/data/";
products_folder = "/products";
products_file = "products.json";

const full_path = path.join(data_folder, products_folder, products_file);

const abs_path = path.resolve(__dirname, "data", "products", "products.json");

console.log(abs_path);
// /Users/username/Documents/dev/learn_node/data/products/products.json

path.resolve() 从右到左处理路径序列,每个后续路径都添加到前面,直到构造出绝对路径。

文件系统模块

毫无疑问,这是最常用的模块之一,该模块允许你处理服务器上的文件和文件夹

FS 模块允许以两种不同的方式操作文件和文件夹。你可以在同步或异步模式下执行此操作。

同步函数

这意味着此函数处于阻塞状态,NodeJS 将等待函数返回值,然后再恢复应用程序的执行。

异步函数

这意味着 NodeJS 不会等待函数返回值,它将继续执行你的应用程序,并在函数完成后处理结果。

使用哪种方法?

这取决于你要开发的应用程序类型。例如,如果你正在开发 Web 服务器,在这种情况下,最好(但不是必须)使用异步函数。同步函数不仅会阻止当前用户的服务器执行,还会阻止所有用户。

另一方面,在某些非常精确的情况下,使用同步函数是合理的。例如,在启动 Web 服务器之前,如果你需要读取配置文件,在这种情况下,同步函数可确保你在启动服务器之前读取该文件。

简而言之,一般情况下,始终使用异步函数,只有在必要时才使用同步函数。

让我们看一个使用 fs 模块和两种函数的示例:
同步函数

1
2
3
4
5
6
7
// app.js

const fs = require("fs");

const data = fs.readFileSync("info.txt", "utf-8");
console.log(data); // file content
console.log("The file has been read");

这里的结果很容易预测,代码将逐行执行。

异步函数

1
2
3
4
5
6
const fs = require("fs");

const info = fs.readFile("info.txt", "utf-8", (err, data) => {
console.log(data);
});
console.log("The file has been read");

在这里,NodeJS 不会等待函数返回以继续执行。

这将导致首先显示“文件已读取”,并且当 readFile() 完成其工作时,NodeJS 将执行回调函数 console.log(data)

读取和创建文件

请注意,在本教程的其余部分中,我们将仅使用异步函数。

首先,我们将创建一个文本文件。为此,我们将使用 writeFile 函数

1
2
3
4
5
6
7
const fs = require("fs");

const data = "This is my Hello World file";

fs.writeFile("info.txt", data, "utf-8", (err) => {
console.log("File created");
});

writeFile() 函数非常具有自描述性。你必须指定文件名、数据和编码选项。(文本为 utf-8

如果你运行此代码,将在当前文件夹中创建 info.txt 文件。

然后就可以使用 readFile 函数读取此文件

1
2
3
4
5
const fs = require("fs");

const info = fs.readFile("info.txt", "utf-8", (err, data) => {
console.log(data);
});

如果文件不存在,你可以返回错误

1
2
3
4
5
6
const info = fs.readFile('info.txt', 'utf-8', (err, data) => {
if (err)
console.log(err)
else
console.log(data)
})`

也可以使用 readFile 但使用承诺来读取文件。

1
2
3
4
5
6
7
8
const fs = require("fs").promises;

const start = async () => {
const data = await fs.readFile("info.txt", "utf8");
console.log(data);
};

start();

导入方式不同,语法也不同,但结果相同

复制文件

要复制文件,我们使用 copyFile 函数

1
2
3
4
fs.copyFile("info.txt", "info2.txt", (err) => {
if (err) return console.error(err);
console.log("File copied");
});

创建文件夹

要创建文件夹,我们使用 mkdir 函数

1
2
3
fs.mkdir("data", (err) => {
console.log("Data folder created");
});

文件夹在当前文件夹内创建

列出文件夹中的文件

可以获取文件夹中的文件列表

1
2
3
fs.readdir(".", (err, files) => {
console.log(files);
});

'.' 代表当前文件
files 是包含所有文件夹文件名的数组

重命名文件

要重命名文件,我们使用 rename() 函数

1
2
3
4
fs.rename("info.txt", "data.txt", (err) => {
if (err) return console.log(err);
console.log("File renamed");
});

可能性几乎是无穷无尽的!
如果你想要了解所有可用的 fs 函数,你现在有了 fs 模块的基础,请访问 NodeJS 网站了解所有详细信息:https://nodejs.org/api/fs.html


相关文章: