Node的文件系统

tech2025-04-02  15

文件系统(File System)

文件系统简单来说就是通过Node来操作系统中的文件

在Node中,与文件系统的交互是非常重要的,服务器的本质就将本地的文件发送给远程的客户端

Node通过fs模块来和文件系统进行交互

该模块提供了一些标准文件访问API来打开、读取、写入文件,以及与其交互。

要使用fs模块,首先需要对其进行加载

var fs = require("fs");

同步和异步调用

fs模块中所以的操作都有两种形式可供选择 同步和异步。同步文件系统会阻塞程序的执行,也就是除非操作完毕,否则不会向下执行代码。异步文件系统不会阻塞程序的执行,而是在操作完成时,通过回调函数将结果返回。

文件的写入

同步

手动操作的步骤

打开文件

fs.openSync(path[, flags, mode])

path 要打开文件的路径

flags 打开文件要做的操作类型

r 只读的

w 可写的

mode 设置文件的操作权限, 一般不传

返回值:

​ 该方法会返回一个文件的描述符作为结果,我们可以通过该描述符来进行各种操作。

var fd = fs.openSync("hello.txt", "w");

向文件中写入内容

fs.writeSync(fd, string[, position[, encoding]])

fd 文件的描述符,需要传递要写入的文件的描述符

string 要写入的内容

position 写入的起始位置

encoding 写入的编码,默认utf-8

fs.writeFileSync(fd, "写入的内容");

保存并关闭文件

fs.closeSync(fd)

fd 要关闭的文件的描述符

完整代码:

var fs = require("fs"); var fd = fs.openSync("hello.txt", "w"); console.log(fd); fs.writeFileSync(fd, "写入的内容"); fs.closeSync(fd);

异步

打开一个文件

fs.open(path[, flags[, mode], callback)

var fs = require("fs"); fs.open("hello2.txt", "w", function(){});

注意: 这里不能用一个变量来保存值,异步没有返回值

异步调用的方法,结果都是通过回调函数的参数来返回的

回调函数两个参数:

err 错误对象,如果没有错误则为nullfd 文件的描述符

写入内容,关闭文件,完整代码:

var fs = require("fs"); fs.open("hello2.txt", "w", function(err, fd){ if(!err) { //如果没出错,对文件进行写入操作 fs.write(fd, "这是异步写入的内容", function(err) { if(!err) { console.log("写入成功"); } //关闭文件 fs.close(fd, function(err) { if(!err) { console.log("文件已关闭"); } }) }) }else { console.log(err); } });

简单文件写入

- 异步

fs.writeFile(file, data[, options], callback)

- 同步

fs.writeFileSync(file, data[, options])

file 要操作文件的路径

data 要写入的数据

options 选项,可以对写入进行一些设置(对象作为参数)

callback 当写入完成以后执行的函数

flag

​ r 只读

​ w 可写

​ a 追加

var fs = require("fs"); fs.writeFile("hello3.txt", "这是writeFile写入的内容", function(err) { if(!err) { console.log("写入成功"); } });

如果不想文本从头写,往后追加内容

fs.writeFile("hello3.txt", "这是writeFile写入的内容", {flag: "a"}, function(err) { if(!err) { console.log("写入成功"); } });

流式文件写入

​ 同步、异步、简单文件的写入都不适合大文件的写入,性能较差,容易导致内存溢出

fs.createWriteStream(path[, options])

可以用来创建一个可写流path 文件路径options 配置的参数 var fs = require("fs"); //创建一个可写流 var ws = fs.createWriteStream("hello3.txt"); //通过ws向文件中输出内容 ws.write("通过可写流写入的内容"); ws.write("通过可写流写入的内容");

可以通过监听流的open和close时间来监听流的打开和关闭

on(事件字符串,回调函数)

可以为对象绑定一个事件

once(事件字符串,回调函数)

可以为对象绑定一个一次性的事件,该事件将会触发一次以后自动失效 var fs = require("fs"); //创建一个可写流 var ws = fs.createWriteStream("hello3.txt"); //可以通过监听流的open和close时间来监听流的打开和关闭 ws.once("open", function() { console.log("流打开了"); }); ws.once("close", function() { console.log("流关闭了"); }); //通过ws向文件中输出内容 ws.write("通过可写流写入的内容"); ws.write("1111111"); ws.end();

文件的读取

简单文件读取

fs.readFile(path[, options], callback)

fs.readFileSync(path[, options])

path 要读取的文件的路径options 读取的选项callback 回调函数,通过回调函数将读取的内容返回(err, data) err 错误对象data 读取到的数据,会返回一个Buffer var fs = require("fs"); fs.readFile("hello3.txt", function(err, data) { if(!err) { console.log(data); } })

流式文件读取

fs.createReadStream(path[, options])

​ 流式文件读取也使用于一些比较大的文件,可以分多次将文件读取到内存中。

var fs = require("fs"); var rs = fs.createReadStream("hello3.txt"); //监听流的开启和关闭 rs.once("open", function() { console.log("可读流打开了"); }); rs.once("close", function() { console.log("可读流关闭了"); }); //如果要读取一个可读流中的数据,必须要为可读流绑定一个data事件,data事件绑定完毕,它会自动开始读取数据 rs.on("data", function(data) { console.log(data); });

pipe() 可以将可读流中的内容,直接输出到可写流中

var fs = require("fs"); var rs = fs.createReadStream("hello3.txt"); var ws = fs.createWriteStream("hello4.txt"); //监听流的开启和关闭 rs.once("open", function() { console.log("可读流打开了"); }); rs.once("close", function() { console.log("可读流关闭了"); }); ws.once("open", function() { console.log("可写流打开了"); }); ws.once("close", function() { console.log("可写流关闭了"); }); rs.pipe(ws);

fs中常用的方法

验证路径是否存在

fs.existsSync(path);

var fs = require("fs"); var isExists = fs.existsSync("hello3.txt"); console.log(isExists);

获取文件的状态

fs.stat(path, callback)

fs.statSync(path)

它会给我们返回一个对象,这个对象中保存了当前对象状态的相关信息。

fs.stat("hello3.txt", function(err, stat) { console.log(stat.isFile()); })

删除文件

fs.unlink(path, callback)

fs.unlinkSync(path)

读取一个目录的目录结构

fs.readdir(path[, options], callback)

fs.readdirSync(path[, options])

fs.readdir(".", function(err, files) { if(!err) { console.log(files); } })

截断文件

fs.truncate(path[, len], callback)

fs.truncateSync(path[, len])

将文件修改成为指定的大小。

创建目录

fs.mkdir(path[, options], callback)

fs.mkdirSync(path[, options])

删除目录

fs.rmdir(path[, options], callback)

fs.rmdirSync(path[, options])

重命名文件夹

fs.rename(oldPath, newPath, callback)

fs.renameSync(oldPath, newPath)

fs.rename("hello2.txt", "hello5.txt", function(err) { if(!err) { console.log("修改成功"); } })

fs.rmdirSync(path[, options])

重命名文件夹

fs.rename(oldPath, newPath, callback)

fs.renameSync(oldPath, newPath)

fs.rename("hello2.txt", "hello5.txt", function(err) { if(!err) { console.log("修改成功"); } })

更多详见:http://nodejs.cn/api/fs.html

最新回复(0)