这期内容当中小编将会给大家带来有关怎么在nodeJS中使用fs模块对文件进行读写,文章内容丰富且以专业的角度为大家分析和叙述,阅读完这篇文章希望大家可以有所收获。
成都创新互联坚持“要么做到,要么别承诺”的工作理念,服务领域包括:成都网站建设、网站设计、企业官网、英文网站、手机端网站、网站推广等服务,满足客户于互联网时代的镇宁网站设计、移动媒体设计的需求,帮助企业找到有效的互联网解决方案。努力成为您成熟可靠的网络建设合作伙伴!
文件 I/O 是由简单封装的标准 POSIX 函数提供的。 nodeJS中通过 require('fs') 使用fs模块。 所有的方法都有异步和同步的形式。
异步形式始终以完成回调作为它最后一个参数。 传给完成回调的参数取决于具体方法,但第一个参数总是留给异常。 如果操作成功完成,则第一个参数会是 null 或 undefined
//异步示例 var fs = require('fs'); fs.unlink('/tmp/hello', function(err){ if (err) throw err; console.log('successfully deleted /tmp/hello'); });
当使用同步形式时,任何异常都会被立即抛出。 可以使用 try/catch 来处理异常,或让它们往上冒泡
//同步示例 var fs = require('fs'); fs.unlinkSync('/tmp/hello'); console.log('successfully deleted /tmp/hello');
异步方法不保证执行顺序。 所以下面的例子容易出错
fs.rename('/tmp/hello', '/tmp/world', function(err){ if (err) throw err; console.log('renamed complete'); }); fs.stat('/tmp/world', function(err, stats){ if (err) throw err; console.log('stats: ${JSON.stringify(stats)}'); });
fs.stat 可能在 fs.rename 之前执行。正确的方法是把回调链起来
fs.rename('/tmp/hello', '/tmp/world', function(err){ if (err) throw err; fs.stat('/tmp/world', function(err, stats){ if (err) throw err; console.log('stats: ${JSON.stringify(stats)}'); }); });
推荐开发者使用这些函数的异步版本。 同步版本会阻塞整个进程,直到它们完成(停止所有连接)
参数如下:
path
| flags
| mode
设置文件模式(权限和 sticky 位),但只有当文件被创建时才有效。默认为 0666,可读写 callback
该回调有两个参数 (err错误, fd文件标识,与定时器标识类似)
flags可以是:
'r' - 以读取模式打开文件。如果文件不存在则发生异常。
'r+' - 以读写模式打开文件。如果文件不存在则发生异常。
'rs+' - 以同步读写模式打开文件。命令操作系统绕过本地文件系统缓存。
'w' - 以写入模式打开文件。文件会被创建(如果文件不存在)或截断(如果文件存在)。
'wx' - 类似 'w',但如果 path 存在,则失败。
'w+' - 以读写模式打开文件。文件会被创建(如果文件不存在)或截断(如果文件存在)。
'wx+' - 类似 'w+',但如果 path 存在,则失败。
'a' - 以追加模式打开文件。如果文件不存在,则会被创建。
'ax' - 类似于 'a',但如果 path 存在,则失败。
'a+' - 以读取和追加模式打开文件。如果文件不存在,则会被创建。
'ax+' - 类似于 'a+',但如果 path 存在,则失败。
[注意]使用'rs+'模式不会使fs.open()进入同步阻塞调用。如果那是你想要的,则应该使用fs.openSync()
var fs = require('fs'); fs.open('a.txt','r',function(err,fs){ console.log(err);//null console.log(fs);//3 })
var fs = require('fs'); fs.open('b.txt','r',function(err,fs){ /* { Error: ENOENT: no such file or directory, open 'D:\project\b.txt' at Error (native) errno: -4058, code: 'ENOENT', syscall: 'open', path: 'D:\\project\\b.txt' } */ console.log(err); console.log(fs);//undefined })
文件的回调函数中的第二个参数fd代表文件标识,与定时器标识类似,用于标识文件,且随着文件的打开顺序递增
var fs = require('fs'); fs.open('1.txt','r',function(err,fs){ console.log(fs);//3 }) fs.open('2.txt','r',function(err,fs){ console.log(fs);//4 })
fs.open() 的同步版本。 返回一个表示文件描述符的整数
var fs = require('fs'); var result = fs.openSync('1.txt','r'); console.log(result);//3
参数如下:
fd
通过 fs.open() 方法返回的文件描述符 buffer
| 数据将被写入到buffer offset
buffer中开始写入的偏移量 length
指定要读取的字节数(整数) position
指定从文件中开始读取的位置(整数)。 如果position为null,则数据从当前文件位置开始读取 callback
回调有三个参数 (err, bytesRead, buffer)。err为错误信息,bytesRead表示读取的字节数,buffer为缓冲区对象
由于使用read()方法,会将文件内容读取buffer对象中,所以需要提前先准备一个buffer对象
var fs = require('fs'); fs.open('1.txt','r',function(err,fd){ if(err){ console.log('文件打开失败'); }else{ var bf = Buffer.alloc(5); fs.read(fd,bf,0,3,null,function(err,len,buffer){ console.log(err);//null console.log(len);//3 console.log(buffer);//}) } });
fs.read() 的同步版本,返回 bytesRead 的数量
var fs = require('fs'); var fd = fs.openSync('1.txt','r'); var bf = Buffer.alloc(5); var result = fs.readSync(fd,bf,0,3,null); console.log(result);//3
参数如下
fd
文件标识 buffer
| 要将buffer中的数据写入到文件中 offset
buffer对象中要写入的数据的起始位置 length
length是一个整数,指定要写入的字节数 position
指定从文件开始写入数据的位置的偏移量。 如果 typeof position !== 'number',则数据从当前位置写入 callback
回调有三个参数(err, written, buffer),其中written指定从buffer写入了多少字节
[注意]多次对同一文件使用fs.write且不等待回调,是不安全的。对于这种情况,强烈推荐使用 fs.createWriteStream
当我们要对打开的文件进行写操作的时候,打开文件的模式应该是读写模式
var fs = require('fs'); fs.open('1.txt','r+',function(err,fd){ if(err){ console.log('文件打开失败'); }else{ var bf = Buffer.from('test'); fs.write(fd,bf,0,3,null,function(err,len,buffer){ console.log(err);//null console.log(len);//3 console.log(buffer);//}) } });
该方法写入data到fd指定的文件。如果data不是一个Buffer实例,则该值将被强制转换为一个字符串
不同于写入 buffer,该方法整个字符串必须被写入。不能指定子字符串,这是因为结果数据的字节偏移量可能与字符串的偏移量不同
fd
文件标识 data
| 要将string或buffer中的数据写入到文件中 position
指向从文件开始写入数据的位置的偏移量。 如果 typeof position !== 'number',则数据从当前位置写入 encoding
期望的字符串编码 callback
回调有三个参数(err, written, str),其中written指定从str写入了多少字节
var fs = require('fs'); fs.open('1.txt','r+',function(err,fd){ if(err){ console.log('文件打开失败'); }else{ fs.write(fd,'12345',function(err,len,str){ console.log(err);//null console.log(len);//5 console.log(str);//}) } });
fs.write() 的同步版本。返回写入的字节数
var fs = require('fs'); var fd = fs.openSync('1.txt','r+'); var bf = Buffer.alloc(5); var result = fs.writeSync(fd,bf,0,3,null); console.log(result);//3
一个文件被操作后,要及时将该文件关闭
参数如下:
fd - 通过 fs.open() 方法返回的文件描述符。
callback - 回调函数,没有参数。
var fs = require('fs'); fs.open('1.txt','r+',function(err,fd){ if(err){ console.log('文件打开失败'); }else{ fs.close(fd, function(err){ if (err){ console.log(err); } console.log("文件关闭成功"); }); } });
fs.close(fd, callback)的同步版本,返回undefined
var fs = require('fs'); var fd = fs.openSync('1.txt','r+'); fs.closeSync(fd);
上一部分介绍的都是些底层的操作,接下来将介绍一些更便捷的文件操作。使用下列方法的时候,不需要再打开和关闭文件,直接操作即可
异步的将数据写入一个文件,如果文件不存在则新建,如果文件原先存在,会被替换
参数如下:
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.writeFile() 的同步版本。返回 undefined
var fs = require('fs'); var filename = '1.txt'; fs.writeFileSync(filename,'abc');
异步地追加数据到一个文件,如果文件不存在则创建文件。 data 可以是一个字符串或 buffer
参数如下
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.appendFile()的同步版本。返回undefined
var fs = require('fs'); var filename = '1.txt'; fs.appendFileSync(filename,' lalala');
参数如下
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);//console.log(data.toString());//'abc world lalala' } });
fs.readFile的同步版本。返回file的内容
如果指定了encoding选项,则该函数返回一个字符串,否则返回一个buffer
var fs = require('fs'); var filename = '1.txt'; var result = fs.readFileSync(filename); console.log(result);//console.log(result.toString());'abc world lalala'
参数如下:
path - 文件路径。
callback - 回调函数,没有参数。
var fs = require('fs'); var filename = '1.txt'; fs.unlink(filename, function(err) { if (err) { return console.log('删除失败'); } console.log("删除成功"); });
fs.unlink(path, callback)的同步版本,返回值为undefined
var fs = require('fs'); var filename = '1.txt'; fs.unlink(filename);
参数如下:
oldPath
| newPath
| callback
回调只有一个可能的异常参数
var fs = require('fs'); var filename = 'a.txt'; fs.rename(filename,'2.new.txt',function(err){ console.log(err);//null })
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类中的提供方法判断文件的相关属性
参数如下:
path - 文件路径。
callback - 回调函数,带有两个参数如:(err, stats), stats 是 fs.Stats 对象
var fs = require('fs'); var filename = 'a.txt'; fs.stat(filename,function(err,stats){ console.log(err);//null /* { 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(stats); });
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.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
参数如下
filename
| options
|