文件系统简单来说就是通过Node来操作系统中的文件
在Node中,与文件系统的交互是非常重要的,服务器的本质就将本地的文件发送给远程的客户端
Node通过fs模块来和文件系统进行交互
该模块提供了一些标准文件访问API来打开、读取、写入文件,以及与其交互。
要使用fs模块,首先需要对其进行加载
var fs = require("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("通过可写流写入的内容");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); });验证路径是否存在
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