File System?
File System 是Node中使用最为频繁的模块之一,该模块提供了读写文件系统的能力。
浏览器中的JavaScript没有读写本地文件系统的能力(忽略IE中的ActiveX),而Node作服务器编程语言,文件 系统API是必须的,File System模块包含了数十个文件操作的API,查阅API。
下面介绍几个常用的API
1.readFile
声明如下:
1 2 3 4 5 6 7
| fs.readFile(file[,options,callback])# Added: v0.1.29 file <String> | <Buffer> | <Integer> filename of file descriptor options <Object> | <String> encoding <String> | <Null> default = null flag <String> defult = "r" callblack = <Function>
|
readFile 方法用异步来读取文件中的内容,例如:
1 2 3 4 5
| var fs= require("fs"); var data = fs.readFileSync("foo.txt",function (err,data){ if (err) thorw err; console.log(data); });
|
readFile会将一个文件的全部内容读到内存中,适用于提交较小的文本;如果有一个数百MB大小的文件需要读取,建议不要使用readFile而是选择stream。readFile读出的数据需要在回调方法中获取,而readFileSync直接返回文本数据内容。
1 2 3
| var fs= require("fs"); var data = fs.readFileSync("foo.txt",{encoding:"UTF-8"}); console.log(data);
|
如果不指定File的encoding配置,readFile会直接返回类似Buffer格式;如果希望得到的是字符串形式,还需要调用toString方法进行转化.
2.writeFile
声明如下:
1 2 3 4 5 6 7 8
| fs.writeFile(file, data[, option],callback); file <String> | <Buffer> | <Integer> filename of file descriptor data <String> | <Bufer> options <Object> | <String> encoding <String> | <Null> default = null mode <Integer> defult = 0o666 flag <String> defult = "w" callblack = <Function>
|
在WriteFile的第一个参数文件名,如果不存在,则会尝试创建它(默认flag为w)。
1 2 3 4 5 6 7 8
| var fs = require("fs"); fs.writeFile("foo.txt", "你好", { flag: "a", encoding: "UTF-8" }, function (err) { if (err) { console.log(err); return; } console.log("success"); });
|
3.fs.stat(path,callback)
stat方法通常用来获取3文件状态。
通常开发者可以再调用opne(),read(),或者write方法之前调用fs.stat方法,用来判断文件是否存在。
1 2 3 4 5 6 7 8
| var fs = require("fs"); fs.stat("test.txt",function(err,result){ if (err){ console.log(err); return; } console.log(result); });
|
文件存在返回文件信息,如果不存在则会出现Error ENOENT:no such file or director的错误。
4.fs.stat和fs.fstat的区别
声明如下:
fs.stat和fs.fstat在功能上是等价的,唯一的区别是fstat第一个参数是文件的描述符,格式为Integer,因此fstat方法通常搭配open方法使用,因为open方法返回得到结果就是一个文件描述。
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15
| var fs = require("fs"); fs.open("test.txt","a",function (err,fd){ if (err){ console.log(); return; } console.log(fd); fs.fstat(fd,function(err,result){ if (err){ console.log(err); return; } console.log(result); }); });
|
下面是一个例子————获取目录下所有的文件名,这是一个常见的需求,实现这个功能只需要fs.readFile以及fs.stat连个API,readdir用于获取目录下所有的问文件或者子目录,stat用来判断具体每条记录是文件还是子目录,如果是子目录,则递归调用整个方法。
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16
| var fs = require("fs"); function getAllFileFromPath(path) { fs.readdir(path, function (err, res) { for (var subPath of res) { //这里使用同步方法而非异步 var statObj = fs.statSync(path + "/" + subPath); if (statObj.isDirectory()) {//判断是否为目录 console.log("Dir:", subPath); getAllFileFromPath(path + "/" + subPath) } else { console.log("File:", subPath); } } }) } getAllFileFromPath(__dirname);
|