NodeJS提供了fs模块来本地文件。大致有这些内容:
在操作文件之前,我们需要检查一下这个文件是否存在,fs模块提供了access方法,语法如下:fs.access(path,mode,callback)
。
path:就是文件路径;
mode:表示文件的可访问性,默认值是fs.constants.F_OK,这个值都是常量,有这几种类型:
callback:回调函数,返回的是检查文件的可访问情况,代码如下:
const fs = require('fs');
fs.access("./build.json", fs.constants.F_OK, (err) => {
if(err){
console.log("文件不存在",err);
return;
}
console.log("文件存在")
})
正如山兔所示,当检查的文件不存在时候,就会返回对应的错误类型。
相关的错误类型如下:
如果想通过同步的方法来执行的话,就调用这个方法accessSync()。
fs有两个方法来读取文件,分别是readFile()和readFileSync(),两个方法的区别是readFile方法为异步读取,readFileSync为同步读取。
语法如下:
fs.readFile(file,encoding,callback)
fs.readFileSync(file,encoding)
encoding:表示文件的编码格式,callback是回调函数【通常情况下,异步操作都会设置回调函数来处理结果】
实例代码如下:
const fs = require('fs');
fs.readFile("./build.json", "ascii", (err, data) => {
if (err) {
console.log(err)
return;
}
console.log("文件内容:", data)
})
结果如下:
这是读取文件内容。如果需要将内容写入文件中,则有以下4个方法:
这两个方法的语法如下:
fs.writeFile(file, data[, options], callback)
fs.writeFileSync(file, data[, options])
其中的参数data就是要写入文件的内容,以上面的代码为例,将读取到的内容写入另一个文件中【其实也就是新增一个文件】,修改后代码如下:
const fs = require('fs');
fs.readFile("./build.json", "ascii", (err, data) => {
if (err) {
console.log(err)
return;
}
console.log("文件内容:", data);
fs.writeFile("test.json", JSON.stringify({
data,
name: "duxin"
}), "utf-8", (err) => {
if (err) {
throw error
}
console.log("异步写入文件完成")
})
})
新增文件test.json的内容如下:
{"data":"{\n \"apps\": [\n {\n \"name\": \"build.json\",\n \"script\": \"npm run start\"\n }\n ]\n}","name":"duxin"}
这两个方法则是向文件追加内容,比如:
fs.appendFile("test.json","添加测试内容",(err)=>{
if(err){
return;
}
console.log("添加完成")
})
在上面的几个案例代码,添加了异常处理,这都是异步的异常处理,如果是同步操作,那么如何处理异常呢?
答案是使用try-catch语句来处理,例如:
//引入模块
var fs = require('fs');
//文件读取
try {
var data = fs.readFileSync('textfile.txt', 'utf8');
console.log(data);
} catch (e) {
console.log(e);
}
//文件写入
try {
fs.writeFileSync('textfile.txt', 'Hello World .. !', 'utf8');
console.log('完成文件写入操作');
} catch (e) {
console.log(e);
}
当遇到文件太大的时候,一般情况我们会截取文件的一部分。那么在NodeJS中,就是通过truncate()方法来完成文件的截取。语法如下:
fs.truncate(path[, len], callback)
path:就是要截取的文件名以及文件路径
len:是一个整数,用于指定截断后文件的大小,单位是字节
callback:用于指定截断文件操作完毕时执行的回调函数,该回调函数中使用一个参数,参数值为截断文件操作失败时触发的错误对象。
但是len等于0的时候,截取后的文件为空。
案例代码:
var fs = require('fs');
fs.stat("poems.txt",function(err,stats){
console.log("原文件大小为:"+stats.size+"字节")
})
fs.truncate('poems.txt', 140, function (err) {
if (err) console.log('对文件进行截断操作失败。');
else {
fs.stat('poems.txt', function (err, stats) {
console.log('截断操作已完成\n文件大小为:' + stats.size + '字节。');
});
}
});
案例代码:
fs.unlink("./test.json",(err)=>{
if(err){
console.log("文件删除报错了")
}
console.log("文件删除成功")
})
语法如下:
fs.copyFile(src, dest[, mode], callback)
fs.copyFileSync(src, dest[, mode])
src:要复制的源文件名。
dest:要复制的目标文件名。
mode:复制操作的修饰符,默认值为0。
callback:回调函数。
代码如下:
fs.copyFile("fs.js","test.js",(err)=>{
if(err){
console.log("文件复制失败");
return;
}
console.log("文件复制成功!")
})
创建目录,也就是创建文件夹,语法如下:
fs.mkdir(path[, options], callback)
fs.mkdirSync(path[, options])
path:就是要创建文件的位置;
options:指定这个文件的权限;
callback:回调函数,返回一个参数,表示创建文件夹是否成功。
通过readdir()方法或者readdirSync()方法来实现读取文件目录,语法如下:
fs.readdir(path[, options], callback)
案例代码:
const fs = require("fs");
fs.readdir("src", (err, data) => {
if (err) return;
console.log(data)
})
删除目录,就是使用这个方法rmdir ()【只能删除空文件夹】
获取文件或者文件夹信息,就用stat方法,返回文件的大小、类型等等信息,可以通过对应的属性来判断文件是否是文件夹,还是文件。例如:
const fs = require("fs")
fs.stat("b.txt", function (err, stats) {
console.log("是否为文件", stats.isFile())
console.log("是否为文件夹/目录", stats.isDirectory())
})
这就是最近用到相关文件操作的API。