node.js file system文件系统模块入门教程

发布时间:2020-09-11编辑:脚本学堂
有关node.js中File System文件系统模块的用法,node.js异步调用与同步调用的方法,fs.Stats用法详解,需要的朋友参考下。

文件的I/O是由标准POSIX函数封装而成。
需要使用require(‘fs’)访问这个模块。所有的方法都提供了异步和同步两种方式。

异步形式下,方法的最后一个参数需要传入一个执行完成时的回调函数
传给回调函数的参数取决于具体的异步方法,但第一个参数总是保留给异常对象。如果操作成功,那么该异常对象就变为null或者undefined。

异步调用的例子:
 

复制代码 代码示例:
var fs = require(‘fs‘);
 
fs.unlink(‘/tmp/hello‘, function (err) {
  if (err) throw err;
  console.log(‘successfully deleted /tmp/hello‘);
});

进行相同操作的同步调用的例子:
 

复制代码 代码示例:
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));
  });
});

当需要频繁操作时,强烈建议使用异步方法。同步方式在其完成之前将会阻塞当前的整个进程,即搁置所有连接。
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(‘message.txt‘, ‘Hello Node‘, function (err) {
  if (err) throw err;
  console.log(‘It’s saved!‘);
});
fs.writeFileSync(filename, data, encoding=‘utf8‘)
 

同步调用fs.writeFile的方式。
fs.watchFile(filename, [options], listener)
监听指定文件filename的变化,回调函数listener将在每次该文件被访问时被调用。
第二个参数是可选项,如果指定了options参数,它应该是一个包含如下内容的对象:名为persistent的布尔值,和名为interval单位为毫秒的轮询时间间隔,默认值为{ persistent: true, interval: 0 }。
listener监听器将获得两个参数,分别标识当前的状态对象和改变前的状态对象。
 

复制代码 代码示例:
fs.watchFile(f, function (curr, prev) {
  console.log(‘the current mtime is: ‘ + curr.mtime);
  console.log(‘the previous mtime was: ‘ + prev.mtime);
});
 

这些状态对象为fs.Stat的实例。
如果你想在文件被修改而不是被访问时得到通知,你还需要比较curr.mtime和prev.mtime的值。
fs.unwatchFile(filename)
停止监听文件filename的变化。
fs.Stats
fs.stat()和 fs.lstat()方法返回的对象为此类型。
 

复制代码 代码示例:
stats.isFile()
stats.isDirectory()
stats.isBlockDevice()
stats.isCharacterDevice()
stats.isSymbolicLink() (only valid with fs.lstat()) stats.isSymbolicLink() (仅对fs.lstat()有效)
stats.isFIFO()
stats.isSocket()

fs.ReadStream

ReadStream是一个Readable Stream可读流。

fs.createReadStream(path, [options])
返回一个新的可读流对象(参见Readable Stream)。
options是包含如下默认值的对象:
 

复制代码 代码示例:
{ flags: ‘r‘,
  encoding: null,
  fd: null,
  mode: 0666,
  bufferSize: 64 * 1024
}


如果不想读取文件的全部内容,可以在options参数中设置start和end属性值以读取文件中指定范围的内容。
start和end包含在范围中(闭集合),取值从0开始。这两个参数需要同时设置。

例子,从一个长度为100字节的文件中读取最后10个字节:
 

复制代码 代码示例:
fs.createReadStream(‘sample.txt‘, {start: 90, end: 99});
fs.WriteStream

WriteStream为可写流。
Event: ‘open’ 事件:’open’
function (fd) { }
fd是可写流所使用的文件描述符。

fs.createWriteStream(path, [options])
返回一个新的可写流对象(参见Writable Stream)。
options参数是包含如下默认值的对象:
 

复制代码 代码示例:
{ flags: ‘w‘,
  encoding: null,
  mode: 0666
}