查询文件信息
fs.stat() 方法用于查询文件信息,可以用于查询文件的大小、创建时间、权限等相关信息。fs.stat() 是异步方法,还有一个同步方法 fs.statSync(path)
const fs = require('fs')
fs.stat('./package.json', (err, stats) => {
console.log(stats)
})
//结果:
Stats {
dev: 3398770662,
mode: 33206,
nlink: 1,
uid: 0,
gid: 0,
rdev: 0,
blksize: undefined,
ino: 281474977191181,
size: 102,
blocks: undefined,
atimeMs: 1539916950573.615,
mtimeMs: 1539847217956.458,
ctimeMs: 1539847217956.458,
birthtimeMs: 1539847139123.2393,
atime: 2018-10-19T02:42:30.574Z,
mtime: 2018-10-18T07:20:17.956Z,
ctime: 2018-10-18T07:20:17.956Z,
birthtime: 2018-10-18T07:18:59.123Z }
执行后,会将 stat 类的实例返回给其回调函数。可以通过 stat 类中的提供方法判断文件的相关属性。
判断是否为标准文件
stats.isFile()
判断是否为路径
stats. isDirectory()
stats. isBlockDevice()
如果是块设备,返回true,大多数情况下类UNIX系统的块设备都位于/dev目录下
stats. isCharacterDevice()
如果是字符设备,返回true
stats. isSymbolicLink()
如果是符号连接,返回true。( fs.lstat() 方法返回的stats对象才有此方法)
stats.isFIFO()
如果是FIFO,返回true。FIFO是UNIX中的一种特殊类型的命令管道
stats. isSocket()
如果是UNIX套接字,返回true
打开文件
操作文件前需要选对文件进行打开操作。fs.open()方法用于打开文件,打开文件后,文件描述符fs会调用open方法的回调函数,然后就可以通过文件描述符fs
对文件进行读写等操作了。
同步版的方法名为fs.openSync(path, flags[, mode])
fs.open()方法第一个参数是文件路径。第二个参数是标志位,标志位表示文件的打开模式。标志含义与UNIX中fopen的标识位相同:
r 打开文本文件进行读取,数据流位置在文件起始处
r+ 打开文本文件进行读写,数据流位置在文件起始处
w 如果文件存在,将其清零,不存在创建写入文件。数据流位置在文件起始处
w+ 打开文件进行读写,如果文件存在,将其清零,不存在创建写入文件。数据流位置在文件起始处
const fs = require('fs')
fs.open('./package.json', 'w', (err, fd) => {
console.log(fd) // 3
})
fs.open('./test', 'r', (err, fd) => {
console.log(fd) // 4 (test是文件夹)
})
读取文件信息
下面的代码,文件打开后,会从第5个字节开始,读取其后的1024个字节的数据。读取完成后,fs.read()会回调最后一个回调方法,然后就可以可以处理读取到的的缓冲的数据了。
const fs = require('fs')
fs.open('./package.json', 'r', function (err, fd) {
var readBuffer = new Buffer(1024),
offset = 0,
len = readBuffer.length,
filePostion = 5;
fs.read(fd, readBuffer, offset, len, filePostion, function (err, readByte) {
console.log('读取数据总数:' + readByte + ' bytes'); // ==>读取数据总数:2 bytes
console.log(readBuffer.slice(0, readByte)); //数据已被填充到readBuffer中
})
})
// 打印结果:
读取数据总数:97 bytes
<Buffer 22 6e 61 6d 65 22 3a 20 22 66 69 6c 65 2d 65 78 70 6c 6f 65 72 22 2c 0d 0a 20 20 22 76 65 72 73 69 6f 6e 22 3a 20 22 30 2e 30 2e 31 22 2c 0d 0a 20 20 ... >
该方法用于读取指定文件当中的内容,path参数为该文件的绝对物理路径,其中options参数可选,可以传入编码格式,如读取文本文件时,可传入'utf8',若不指定编码格式,则默认输出读取的文件内容为Buffer形式,故一般都会传入该参数。callback回调参数当中有两个参数err和data,其中err为错误信息参数,一般在在文件不存在或者读取文件失败时触发调用,data为文件内容。
写入文件
文件打开后,可以通过 fs.write()方法传递一个数据缓冲区,以向打开的文件中写入数据。
var fs = require('fs');
fs.open('./fs.txt', 'a', function (err, fd) {
var writeBuffer = new Buffer('这是要写入的字符串'),
offset = 0,
len = writeBuffer.length,
filePostion = null;
fs.write(fd, writeBuffer, offset, len, filePostion, function(err, readByte){
console.log('写数据总数:'+readByte+' bytes' ); // 写数据总数:27 bytes
})
})
追加写入内容
fs.appendFile(path,data[,options],callback)
该方法可用于往指定文件当中追加写入内容,该内容不会覆盖文件当中原有的内容,只会在原有内容的基础上进行追加。若传入的文件路径当中的文件不存在,则先完成该文件的穿件,再往里面写入指定内容。path参数为该文件的绝对物理路径,data为需要写入该文件当中的数据内容,其中options参数可选,可以传入编码格式,若不传则默认为utf8。callback回调参数当中只有一个错误信息参数err,一般在追加写入失败时触发调用。
关闭文件
fs.close(fd, callback)
在前面读写文件的操作中,Node进程退出后就会关闭文件。在实际使用中,不能依靠进程退出来关闭文件,因此必须跟踪那些已打开的文件描述,在使用完毕后使用fs.close()方法关闭文件。
var fs = require('fs');
fs.open('./fs.txt', 'a', function (err, fd) {
//对文件一些操作
fs.close(fd, function(err){ //操作完成后,关闭文件
})
})
确定文件是否存在
fs.stat()
fs.stat()
方法用于查询文件信息,其回调函数中有两个参数(err, stats)
。stats
是一个fs.Stats对象,该对象中包含一个stats.isFile()
方法,如果stats
对象存在且stats.isFile()
为true
才能确认要修改或删除的文件存在。
var fs = require('fs');
fs.stat('/xxx', function(err, stat){
if(stat&&stat.isFile()) {
console.log('文件存在');
} else {
console.log('文件不存在或不是标准文件');
}
});
fs.access()
fs.access()
用于检查到指定path
路径的目录或文件的访问权限。其回调函数中有一个参数(err)
,如果检查失败则会出现错误参数的响应。mode
是要检查的权限掩码,它可以是以下枚举值之一:
-
fs.F_OK
- 文件是对于进程是否可见,可以用来检查文件是否存在。也是mode
的默认值 -
fs.R_OK
- 文件对于进程是否可读 -
fs.W_OK
- 文件对于进程是否可写 -
fs.X_OK
- 文件对于进程是否可执行。(Windows系统不可用,执行效果等同fs.F_OK
)
使用fs.access()
方法检查文件是否存在,可以使用以下方法:
var fs = require('fs');
fs.access('/etc/passwd', function(err) {
console.log(err ? '文件存在' : '文件不存在');
});
使用fs.access()
方法检查是否对文件是否有读写权限,可以使用以下方法:
var fs = require('fs');
fs.access('/etc/passwd', fs.R_OK | fs.W_OK, function(err) {
console.lo(err ? '不可操作!' : '可以读/写');
});
关于fs.stat()
和fs.access()
的同步方法
fs.stat()
和fs.access()
都有对应的同步方法fs.statSync()
和fs.accessSync()
。使用这两个同步方法时当操作成功时返回值和异步方法执行成功相同,但操作失败时会抛出异常,所以使用这两个方法应该注意,个人比较推荐使用异步方法。
文件删除:fs.unlink(path, callback)
不在使用的文件可以用fs.unlink()方法进行删除,删除前应使用fs.exists()方法检查文件是否存在。path参数为该文件的绝对物理路径,callback回调参数当中只有一个错误信息参数err,一般在该文件不存在或者删除文件失败时触发调用。fs.unlinkSync()是其同步版本
var fs = require('fs');
var path = require('path');
var file = path.join(__dirname, './fs.txt');
if( fs.existsSync(file) ){
fs.unlink(file, function(err){
if(err) {
console.log(err);
}
})
}
文件夹操作
fs.mkdir(path[,model],callback)
该方法可以用于创建一个目录文件夹,其中path为该目录的绝对物理路径,callback回调函数当中也只有一个错误信息参数,一般在目录创建失败时触发调用。
注意:该方法不能完成多级目录的创建,node当中要求要创建的那个文件夹所在的文件夹必须能都存在。否则就会出现报错信息。
fs.rename(oldPath,newPath,callback)
该方法可用于移动或重命名指定文件。oldPath参数为该文件原来的路径,newPath参数为该文件移动或重命名之后的路径,这两个参数都必须能传入文件完整的绝对物理路径。callback回调参数当中只有一个错误信息参数,一般在oldPath当中指定的文件不存在或者该操作失败时触发调用。
fs.rmdir(path,callback)
该方法可以用于删除一个空目录。其中path为该目录的绝对物理路径,callback回调函数当中也只有一个错误信息参数,一般在该目录不存在或者删除操作失败时触发调用。
注意:该传入的目录路径当中的目录必须能为一个空目录,否则会出现报错信息,也不能完成删除操作。
fs.readdir(path,callback)
该方法可以用于读取一个指定目录当中的信息。其中path为该目录的绝对物理路径,callback回调函数当中有两个参数err和files,err为错误信息参数,一般在该目录不存在或读取失败时触发调用,files为一个数组对象,包含该目录下的所有文件夹与文件的名字。(仅为文件夹的名字和文件名,不是路径形式)。