文件的I/O是由标准POSIX函数封装而成。
需要使用require(‘fs’)访问这个模块。所有的方法都提供了异步和同步两种方式。
异步形式下,方法的最后一个参数需要传入一个执行完成时的回调函数。
传给回调函数的参数取决于具体的异步方法,但第一个参数总是保留给异常对象。如果操作成功,那么该异常对象就变为null或者undefined。
异步调用的例子:
进行相同操作的同步调用的例子:
由于异步方法调用无法保证执行的顺序,以下代码容易导致错误。
这样做有可能导致fs.stat在fs.rename之前执行,正确的做法是链式调用回调函数。
当需要频繁操作时,强烈建议使用异步方法。同步方式在其完成之前将会阻塞当前的整个进程,即搁置所有连接。
fs.rename(path1, path2, [callback])
异步调用rename(2),重命名某个文件,除非回调函数执行过程出现了异常,否则不会传递任何参数。
fs.renameSync(path1, path2)
同步调用重命名rename(2),重命名某个文件。
fs.truncate(fd, len, [callback])
异步调用ftruncate(2),截断某个文件,除非回调函数执行过程出现了异常,否则不会传递任何参数。
fs.truncateSync(fd, len)
同步调用重命名ftruncate(2),截断某个文件s。
fs.chmod(path, mode, [callback])
异步调用chmod(2),修改文件权限,除非回调函数执行过程出现了异常,否则不会传递任何参数。
fs.chmodSync(path, mode)
同步调用chmod(2),修改文件权限。
fs.stat(path, [callback])
异步调用stat(2),读取文件元信息,回调函数将返回两个参数(err, stats),其中stats是fs.Stats的一个对象,如下所示:
{ dev: 2049,
ino: 305352,
mode: 16877,
nlink: 12,
uid: 1000,
gid: 1000,
rdev: 0,
size: 4096,
blksize: 4096,
blocks: 8,
atime: ‘2009-06-29T11:11:55Z‘,
mtime: ‘2009-06-29T11:11:40Z‘,
ctime: ‘2009-06-29T11:11:40Z‘
}
有关详细信息,请参阅下面的fs.Stats部分
fs.lstat(path, [callback])
异步形式调用lstat(2),回调函数返回两个参数(err, stats),其中stats是fs.Stats的一个对象,lstat()和stat()类似,区别在于当path是一个符号链接时,它指向该链接的属性,而不是所指向文件的属性.
fs.fstat(fd, [callback])
异步形式调用fstat(2),回调函数返回两个参数(err, stats),其中stats是fs.Stats的一个对象。
fs.statSync(path)
同步形式调用stat(2),返回fs.Stats的一个实例。
fs.lstatSync(path)
同步形式调用lstat(2),返回fs.Stats的一个实例。
fs.fstatSync(fd)
同步形式调用fstatSync(2),返回fs.Stats的一个实例。
fs.link(srcpath, dstpath, [callback])
异步调用link(2),创建符号连接,除非回调函数执行过程出现了异常,否则不会传递任何参数。
fs.linkSync(srcpath, dstpath)
同步调用link(2)。
fs.symlink(linkdata, path, [callback])
异步调用symlink(2),除非回调函数执行过程出现了异常,否则不会传递任何参数。
fs.symlinkSync(linkdata, path)
同步调用symlink(2)。
fs.readlink(path, [callback])
异步调用readlink,回调函数返回两个参数(err,resolvedPath),resolvedPath为解析后的文件路径。
fs.readlinkSync(path)
同步调用readlink(2),返回解析后的文件路径。
fs.realpath(path, [callback])
异步调用realpath(2),回调函数返回两个参数(err,resolvedPath),resolvedPath为解析后的文件路径。
fs.realpathSync(path)
同步调用realpath(2),返回解析后的文件路径。
fs.unlink(path, [callback])
异步调用unlink(2),删除链接或者文件,除非回调函数执行过程出现了异常,否则不会传递任何参数。
fs.unlinkSync(path)
同步调用unlink(2)。
fs.rmdir(path, [callback])
异步调用rmdir(2),除非回调函数执行过程出现了异常,否则不会传递任何参数。
fs.rmdirsync(path)
同步调用rmdir(2)。
fs.mkdir(path, mode, [callback])
异步调用mkdir(2),除非回调函数执行过程出现了异常,否则不会传递任何参数。
fs.mkdirSync(path, mode)
同步调用mkdir(2)。
fs.readdir(path, [callback])
异步调用readdir(3),读取目录中的内容。回调函数接受两个参数(err, files),其中files参数是保存了目录中所有文件名的数组(’.'和’..’除外)。
fs.readdirSync(path)
同步调用readdir(3)。返回目录中文件名数组(‘.’与’..’除外)。
fs.close(fd, [callback])
异步同步调用close(2),关闭文件,除非回调函数执行过程出现了异常,否则不会传递任何参数。
fs.closeSync(fd)
同步调用close(2)。
fs.open(path, flags, mode=0666, [callback])
异步开启文件,详阅open(2)。标签可为’r', ‘r+’, ‘w’, ‘w+’, ‘a’, 或 ‘a+’。回调函数接受两个参数(err, fd)。
fs.openSync(path, flags, mode=0666)
同步调用open(2)。
fs.utimes(path, atime, mtime, callback)
fs.utimesSync(path, atime, mtime)
更改文件时间戳。
fs.futimes(path, atime, mtime, callback)
fs.futimesSync(path, atime, mtime)
另一种更改文件时间戳的方式。区别在于如果文件名指向一个符号链接,则改变此符号链接的时间戳,而不改变所引用文件的时间戳。
fs.write(fd, buffer, offset, length, position, [callback])
将buffer缓冲器内容写入fd文件描述符。
offset和length决定了将缓冲器中的哪部分写入文件。
position指明将数据写入文件从头部算起的偏移位置,若position为null,数据将从当前位置开始写入,详阅pwrite(2)。
回调函数接受两个参数(err, written),其中written标识有多少字节的数据已经写入。
fs.writeSync(fd, buffer, offset, length, position)
基于缓冲器的fs.write()的同步版本,返回写入数据的字节数。
fs.writeSync(fd, str, position, encoding=’utf8′)
基于字符串的fs.write()的同步版本,返回写入数据的字节数。
fs.read(fd, buffer, offset, length, position, [callback])
从fd文件描述符中读取数据。
buffer为写入数据的缓冲器。
offset为写入到缓冲器的偏移地址。
length指明了欲读取的数据字节数。
position为一个整形变量,标识从哪个位置开始读取文件,如果position参数为null,数据将从文件当前位置开始读取。
回调函数接受两个参数,(err, bytesRead)。
fs.readSync(fd, buffer, offset, length, position)
基于缓冲器的fs.read的同步版本,返回读取到的bytesRead字节数。
fs.readSync(fd, length, position, encoding)
基于字符串的fs.read的同步版本,返回已经读入的数据的字节数。
fs.readFile(filename, [encoding], [callback])
异步读取一个文件的所有内容,例子如下:
fs.readFile(‘/etc/passwd‘, function (err, data) {
if (err) throw err;
console.log(data);
});
回调函数将传入两个参数(err, data),其中data为文件内容。
如果没有设置编码,那么将返回原始内容格式的缓冲器。
fs.readFileSync(filename, [encoding])
同步调用fs.readFile的版本,返回指定文件filename的文件内容。
如果设置了encoding参数,将返回一个字符串。否则返回一个缓冲器。
fs.writeFile(filename, data, encoding=’utf8′, [callback])
异步写入数据到某个文件中,data可以是字符串或者缓冲器。
例子:
同步调用fs.writeFile的方式。
fs.watchFile(filename, [options], listener)
监听指定文件filename的变化,回调函数listener将在每次该文件被访问时被调用。
第二个参数是可选项,如果指定了options参数,它应该是一个包含如下内容的对象:名为persistent的布尔值,和名为interval单位为毫秒的轮询时间间隔,默认值为{ persistent: true, interval: 0 }。
listener监听器将获得两个参数,分别标识当前的状态对象和改变前的状态对象。
这些状态对象为fs.Stat的实例。
如果你想在文件被修改而不是被访问时得到通知,你还需要比较curr.mtime和prev.mtime的值。
fs.unwatchFile(filename)
停止监听文件filename的变化。
fs.Stats
fs.stat()和 fs.lstat()方法返回的对象为此类型。
fs.ReadStream
ReadStream是一个Readable Stream可读流。
fs.createReadStream(path, [options])
返回一个新的可读流对象(参见Readable Stream)。
options是包含如下默认值的对象:
如果不想读取文件的全部内容,可以在options参数中设置start和end属性值以读取文件中指定范围的内容。
start和end包含在范围中(闭集合),取值从0开始。这两个参数需要同时设置。
例子,从一个长度为100字节的文件中读取最后10个字节:
WriteStream为可写流。
Event: ‘open’ 事件:’open’
function (fd) { }
fd是可写流所使用的文件描述符。
fs.createWriteStream(path, [options])
返回一个新的可写流对象(参见Writable Stream)。
options参数是包含如下默认值的对象: