node.js文件操作系统实例详解(3)

{ dev: 2114, ino: 48064969, mode: 33188, nlink: 1, uid: 85, gid: 100, rdev: 0, size: 527, blksize: 4096, blocks: 8, atime: Mon, 10 Oct 2011 23:24:11 GMT, // 访问时间 mtime: Mon, 10 Oct 2011 23:24:11 GMT, // 文件内容修改时间 ctime: Mon, 10 Oct 2011 23:24:11 GMT, // 文件状态修改时间 birthtime: Mon, 10 Oct 2011 23:24:11 GMT // 创建时间 }

atime:Access Time // 访问时间

mtime:: Modified Time // 文件内容修改时间

ctime: Changed Time. // 文件状态修改时间,比如修改文件所有者、修改权限、重命名等

birthtime: Birth Time // 创建时间。在某些系统上是不可靠的,因为拿不到。

例子:

var fs = require('fs'); var getTimeDesc = function(d){ return [d.getFullYear(), d.getMonth()+1, d.getDate()].join('-') + ' ' + [d.getHours(), d.getMinutes(), d.getSeconds()].join(':'); }; fs.stat('./fileForStat.txt', function(err, stats){ console.log('文件大小: ' + stats.size); console.log('创建时间: ' + getTimeDesc(stats.birthtime)); console.log('访问时间: ' + getTimeDesc(stats.atime)); console.log('修改时间: ' + getTimeDesc(stats.mtime)); });

输出如下:

/usr/local/bin/node stat.js
文件大小: 3613
创建时间: 2016-7-16 12:40:49
访问时间: 2016-7-16 12:40:49
修改时间: 2016-7-16 12:40:49

Process finished with exit code 0

同步的例子:

var fs = require('fs'); var getTimeDesc = function(d){ return [d.getFullYear(), d.getMonth()+1, d.getDate()].join('-') + ' ' + [d.getHours(), d.getMinutes(), d.getSeconds()].join(':'); }; var stats = fs.statSync('./fileForStat.txt'); console.log('文件大小: ' + stats.size); console.log('创建时间: ' + getTimeDesc(stats.birthtime)); console.log('访问时间: ' + getTimeDesc(stats.atime)); console.log('修改时间: ' + getTimeDesc(stats.mtime));

访问/权限检测

例子:

// fs.access(path[, mode], callback) var fs = require('fs'); fs.access('./fileForAccess.txt', function(err){ if(err) throw err; console.log('可以访问'); });

同步版本:

// fs.accessSync(path[, mode]) var fs = require('fs'); // 如果成功,则返回undefined,如果失败,则抛出错误(什么鬼) try{ fs.accessSync('./fileForAccess.txt'); }catch(e){ throw(e); }

文件打开/关闭

比较底层的接口,实际需要用到的机会不多。需要用到的时候看下文档就行。

flags:文件打开模式,比如r、r+、w、w+等。可选模式非常多。

mode:默认是666,可读+可写。

fs.open(path, flags[, mode], callback) fs.openSync(path, flags[, mode]) fs.close(fd, callback) fs.closeSync(fd)

文件读取(底层)

相对底层的读取接口,参数如下

fd:文件句柄。

buffer:将读取的文件内容写到buffer里。

offset:buffer开始写入的位置。(在offset开始写入,还是offset+1?)

length:要读取的字节数。

position:文件从哪个位置开始读取。如果是null,那么就从当前位置开始读取。(读取操作会记录下上一个位置)

此外,callback的回调参数为(err, bytesRead, buffer)

fs.read(fd, buffer, offset, length, position, callback)

追加文件内容

fs.appendFile(file, data[, options], callback)

file:可以是文件路径,也可以是文件句柄。(还可以是buffer?)

data:要追加的内容。string或者buffer。

options

encoding:编码,默认是utf8

mode:默认是0o666

flag:默认是a

注意:如果file是文件句柄,那么

开始追加数据前,file需要已经打开。

file需要手动关闭。

var fs = require('fs'); fs.appendFile('./extra/fileForAppend.txt', 'helo', 'utf8', function(err){ if(err) throw err; console.log('append成功'); });

文件内容截取

fs.truncate(path, len, callback) fs.truncateSync(path, len)

fs.ftruncate(fd, len, callback) fs.ftruncateSync(fd, len)

用途参考linux说明文档

要点:

offset不会变化。比如通过fs.read()读取文件内容,就需要特别注意。

如果len小于文件内容长度,剩余文件内容部分会丢失;如果len大于文件内容长度,那么超出的部分,会用\0进行填充。

如果传的是文件路径,需要确保文件是可写的;如果传的是文件句柄,需要确保文件句柄已经打开并且可写入。

The truncate() and ftruncate() functions cause the regular file named by path or referenced by fd to be truncated to a size of precisely length bytes.

If the file previously was larger than this size, the extra data is lost. If the file previously was shorter, it is extended, and the extended part reads as null bytes ('\0').

The file offset is not changed.

With ftruncate(), the file must be open for writing; with truncate(), the file must be writable.

修改文件属性(时间)

path/fd:文件路径/文件句柄

atime:Access Time。上一次访问文件数据的时间。

mtime:Modified Time。修改时间。

fs.utimes(path, atime, mtime, callback) fs.utimesSync(path, atime, mtime)

fs.futimes(fd, atime, mtime, callback) fs.futimesSync(fd, atime, mtime)

备注,在命令行下可以

通过stat查看文件的状态信息,包括了上面的atime、mtime。

通过touch修改这几个时间。

创建文件链接

fs.symlink(target, path[, type], callback) fs.symlinkSync(target, path[, type])

fs.link(srcpath, dstpath, callback) fs.linkSync(srcpath, dstpath)

link() creates a new link (also known as a hard link) to an existing file.

软链接、硬链接区别:参考 或者 [这个]。(https://www.jb51.net/article/96135.htm)

硬链接:inode相同,多个别名。删除一个硬链接文件,不会影响其他有相同inode的文件。

软链接:有自己的inode,用户数据块存放指向文件的inode。

参考这里

创建临时目录

fs.mkdtemp(prefix, callback) fs.mkdtempSync(prefix)

备忘:跟普通的随便找个目录,创建个随机名字的文件夹,有什么区别?

代码示例如下:

var fs = require('fs'); fs.mkdtemp('/tmp/', function(err, folder){ if(err) throw err; console.log('创建临时目录: ' + folder); });

输出如下:

/usr/local/bin/node mkdtemp.js
创建临时目录: /tmp/Cxw51O

找出软连接指向的真实路径

fs.readlink(path[, options], callback) fs.readlinkSync(path[, options])

如下面例子,创建了个软链接指向fileForReadLink.txt,通过fs.readlink()就可以找出原始的路径。

内容版权声明:除非注明,否则皆为本站原创文章。

转载注明出处:http://www.heiqu.com/4a9fce3edc3c31c96abc4a7ad933d4ef.html