File操作
上一部分介绍的都是些底层的操作,接下来将介绍一些更便捷的文件操作。使用下列方法的时候,不需要再打开和关闭文件,直接操作即可。
写入文件
异步地将数据写入一个文件,如果文件不存在则新建,如果文件原先存在,会被替换。
【fs.writeFile(file, data[, options], callback)】参数如下:
file - 文件名或文件描述符。
data - 要写入文件的数据,可以是 String(字符串) 或 Buffer(流) 对象。
options - 该参数是一个对象,包含 {encoding, mode, flag}。默认编码为 utf8, 模式为 0666 , flag 为 'w'
callback - 回调函数,回调函数只包含错误信息参数(err),在写入失败时返回。
var fs = require('fs');
var filename = '1.txt';
fs.writeFile(filename,'hello',function(err){
console.log(err);//null
})
【fs.writeFileSync(file, data[, options])】
fs.writeFile() 的同步版本,返回 undefined。
var fs = require('fs');
var filename = '1.txt';
fs.writeFileSync(filename,'abc');
追加文件
异步地追加数据到一个文件,如果文件不存在则创建文件。 data 可以是一个字符串或 buffer。
【fs.appendFile(filename, data, [options], callback)】参数如下:
file - 文件名或文件描述符。
data - 要写入文件的数据,可以是 String(字符串) 或 Buffer(流) 对象。
options - 该参数是一个对象,包含 {encoding, mode, flag}。默认编码为 utf8, 模式为 0666 , flag 为 'w'
callback - 回调函数,回调函数只包含错误信息参数(err),在写入失败时返回。
var fs = require('fs');
var filename = '1.txt';
fs.appendFile(filename,' world',function(err){
console.log(err);//null
})
【fs.appendFileSync(file, data[, options])】
fs.appendFile()的同步版本,返回undefined。
var fs = require('fs');
var filename = '1.txt';
fs.appendFileSync(filename,' lalala');
读取文件
【fs.readFile(file[, options], callback)】参数如下
file - 文件名或文件描述符
options - 该参数是一个对象,包含 {encoding, flag}。默认编码为null,即如果字符编码未指定,则返回原始的 buffer;flag默认为'r'
callback - 回调函数,回调有两个参数 (err, data),其中data是文件的内容(buffer对象),err是错误信息参数,在写入失败时返回
var fs = require('fs');
var filename = '1.txt';
fs.readFile(filename,function(err,data){
if(err){
console.log('文件读取失败');
}else{
console.log(data);//<Buffer 61 62 63 20 77 6f 72 6c 64 20 6c 61 6c 61 6c 61>
console.log(data.toString());//'abc world lalala'
}
});
【fs.readFileSync(file[, options])】
fs.readFile的同步版本,返回file的内容。
如果指定了encoding选项,则该函数返回一个字符串,否则返回一个buffer。
var fs = require('fs');
var filename = '1.txt';
var result = fs.readFileSync(filename);
console.log(result);//<Buffer 61 62 63 20 77 6f 72 6c 64 20 6c 61 6c 61 6c 61>
console.log(result.toString());'abc world lalala'
删除文件
【fs.unlink(path, callback)】参数如下:
path - 文件路径。
callback - 回调函数,没有参数。
var fs = require('fs');
var filename = '1.txt';
fs.unlink(filename, function(err) {
if (err) {
return console.log('删除失败');
}
console.log("删除成功");
});
【fs.unlinkSync(path)】
fs.unlink(path, callback)的同步版本,返回值为undefined。
var fs = require('fs');
var filename = '1.txt';
fs.unlink(filename);
重命名
【fs.rename(oldPath, newPath, callback)】参数如下:
oldPath <String> | <Buffer>
newPath <String> | <Buffer>
callback <Function> 回调只有一个可能的异常参数
var fs = require('fs');
var filename = 'a.txt';
fs.rename(filename,'2.new.txt',function(err){
console.log(err);//null
})
【fs.renameSync(oldPath, newPath)】
fs.rename(oldPath, newPath, callback)的同步版本,返回undefined。
var fs = require('fs');
var filename = '2.new.txt';
var result = fs.renameSync(filename,'a.txt');
文件信息
fs.stat()执行后,会将stats类的实例返回给其回调函数,可通过stats类中的提供方法判断文件的相关属性
【fs.stat(path, callback)】参数如下:
var fs = require('fs');
var filename = 'a.txt';
fs.stat(filename,function(err,stats){
console.log(err);//null
console.log(stats);
});
/*
null
Stats {
dev: 16777220,
mode: 33188,
nlink: 1,
uid: 501,
gid: 20,
rdev: 0,
blksize: 4096,
ino: 4304001150,
size: 12,
blocks: 8,
atimeMs: 1551676849161.17,
mtimeMs: 1551676849161.453,
ctimeMs: 1551676849162.1157,
birthtimeMs: 1551676849161.17,
atime: 2019-03-04T05:20:49.161Z,
mtime: 2019-03-04T05:20:49.161Z,
ctime: 2019-03-04T05:20:49.162Z,
birthtime: 2019-03-04T05:20:49.161Z }
*/
stats类中的方法有
stats.isFile() 如果是文件返回 true,否则返回 false。
stats.isDirectory() 如果是目录返回 true,否则返回 false。
stats.isBlockDevice() 如果是块设备返回 true,否则返回 false。
stats.isCharacterDevice() 如果是字符设备返回 true,否则返回 false。
stats.isSymbolicLink() 如果是软链接返回 true,否则返回 false。
stats.isFIFO() 如果是FIFO,返回true,否则返回false。FIFO是UNIX中的一种特殊类型的命令管道。
stats.isSocket() 如果是 Socket 返回 true,否则返回 false。
var fs = require('fs');
var filename = 'a.txt';
fs.stat(filename,function(err,stats){
console.log(stats.isFile());//true
});
【fs.statSync(path)】
fs.stat(path, callback)方法的同步版本,返回一个 fs.stats
实例。
var fs = require('fs');
var filename = 'a.txt';
var result = fs.statSync(filename);
/*
{ dev: 223576,
mode: 33206,
nlink: 1,
uid: 0,
gid: 0,
rdev: 0,
blksize: undefined,
ino: 7599824371527537,
size: 0,
blocks: undefined,
atime: 2017-06-03T14:18:15.370Z,
mtime: 2017-06-03T14:18:15.370Z,
ctime: 2017-06-03T16:32:05.776Z,
birthtime: 2017-06-03T14:18:15.370Z }
*/
console.log(result);
监听
该方法用于监视filename的变化,filename可以是一个文件或一个目录,返回的对象是一个fs.FSWatcher。
【fs.watch(filename[, options][, listener])】参数如下:
filename <String> | <Buffer>
options <String> | <Object> 参数可选,如果options是一个字符串,则它指定了encoding。否则options应该以一个对象传入
persistent <Boolean> 指明如果文件正在被监视,进程是否应该继续运行。默认为true
recursive <Boolean> 指明是否全部子目录应该被监视,或只是当前目录。 适用于当一个目录被指定时,且只在支持的平台。默认为false
encoding <String> 指定用于传给监听器的文件名的字符编码。默认为'utf8'
listener <Function> 回调函数有两个参数 (eventType, filename)。 eventType可以是'rename'或'change',filename是触发事件的文件的名称
回调中提供的 filename 参数仅在 Linux 和 Windows 系统上支持。 即使在支持的平台中,filename 也不能保证提供。 因此,不要以为 filename 参数总是在回调中提供,如果它是空的,需要有一定的后备逻辑。
var fs = require('fs');
var filename = 'a.txt';
fs.watch(filename,function(eventType, _filename){
console.log(eventType);//change
if(_filename){
console.log(_filename + '发生了改变');//'1.txt发生了改变'
}else{
console.log('...');
}
})
[注意]当一个文件出现或消失在一个目录里时,'rename'也会被触发