Node.js查询和读写文件

7.1 处理文件路径

规范化路径
path模块

var path = require('path');
console.log(path.normalize('/foo/bar//baz/asdf/quun/..'));
//\foo\bar\baz\asdf

连接路径
path.join() (同时对路径进行了规范化)

var path = require('path');
console.log(path.join('/foo', 'bar', 'baz/asdf', 'quun', '..'));
//\foo\bar\baz\asdf

解析路径
path.resolve() 将多个路径解析为一个规范化的绝对路径,类似对路径挨个进行cd操作

console.log(path.resolve('/foo/bar', './baz'));
console.log(path.resolve('/foo/bar', '/tmp/file/'));
//D:\foo\bar\baz
//D:\tmp\file

解析相对路径,将当前目录附加到解析结果前面

console.log(path.resolve('wwwroot', 'static/png', '../gif/img.gif'));
//D:\35398\NodeJS\Professional-Nodejs\wwwroot\static\gif\img.gif

查找两个绝对路径之间的相对路径
path.relative()

console.log(path.relative('/data/orandea/test/aaa', '/data/orandea/impl/bbb'));
//..\..\impl\bbb

提取路径的组成部分
path.dirname(filepath) 获取文件路径的目录部分

console.log(path.dirname('/foo/bar/baz/asdf/quun.txt'));
///foo/bar/baz/asdf

path.basename(filepath) 提取文件路径中的文件名

console.log(path.basename('/foo/bar/baz/asdf/quun.html'));
//quun.html

path.basename(filepath, extname) 提取文件路径中含扩展名参数的文件名

console.log(path.basename('/foo/bar/baz/asdf/quun.html', '.html'));
//quun

path.extname(filepath); 提取文件路径的扩展名(.开头)

console.log(path.extname('/a/b/index.html'));
console.log(path.extname('/a/b.c/index'));
console.log(path.extname('/a/b.c/.'));
console.log(path.extname('/a/b.c/d.'));
.html


.

确定路径是否存在
var fs = require(‘fs’);
bool fs.exists(filepath, callback); //异步

var fs = require('fs');
fs.exists('/etc/passwd', function(exists) {
     console.log('exists:', exists);
});
//exists: false

【注】exists函数进行了I/O操作,是异步的,当I/O操作结束后通知回调函数
bool fs.existsSync(filepath); //同步版本,直接返回结果

var fs = require('fs');
fs.exists('/etc/passwd', function(exists) {
    console.log('exists:', exists);
});
console.log(fs.existsSync('D:\\35398'));
//true
//exists: false

7.2 fs模块

查询文件或目录的元信息
fs.stat(filepath, function(err, stats){});
fs.stat()会将stats类的一个实例传给回调函数,该实例调用以下函数:

  • stats.isFile() 若是标准文件返回true
  • stats.isDirectory() 若是目录返回true
  • stats.isBlockDevice() 若是块设备返回true (/dev/…)
  • stats.isCharacterDevice() 若是字符设备返回true
  • stats.isSymbolicLink() 若是符号链接返回true
  • stats.isFifo() 若是FIFO(UNIX一种命名管道)返回true
  • stats.isSocket() 若是UNIX套接字返回true
var fs = require('fs');
fs.stat('.\\fs_stat.js', function(err, stats) {
if(err) { throw err; }
    console.log(stats);
});
node fs_stat.js
Stats {
dev: 3563886850,
mode: 33206,
nlink: 1,
uid: 0,
gid: 0,
rdev: 0,
blksize: undefined,
ino: 1688849860896774,
size: 123,
blocks: undefined,
atimeMs: 1545729145491.3354,
mtimeMs: 1545729145491.3354,
ctimeMs: 1545729145491.3354,
birthtimeMs: 1545729145491.3354,
atime: 2018-12-25T09:12:25.491Z,
mtime: 2018-12-25T09:12:25.491Z,
ctime: 2018-12-25T09:12:25.491Z,
birthtime: 2018-12-25T09:12:25.491Z }

fs.fstat(fd[, function(err, stat) {…}]);

//fs_open_read_close_open_fstat_write.js
fs.open(__dirname + '/b.txt', 'a+', function(err, bFd) {
    if(err) {
        return callback(err);
    }
    fs.fstat(bFd, function(err, bStats) {
        if(err) {
            return callback(err);
        }
        console.log(bStats);
         fs.close(bFd, callback);
    });
});

7.3 打开文件

fs.open(filepath, mode, function(err, fd){
//获取文件描述符fd
});
mode: r, r+, w, w+, a, a+

  • r 打开文本文件进行读取
  • r+ 打开文件进行读写
  • w 创建文件写入数据,若文件存在则清零
  • w+ 创建文件读写数据,若文件存在则清零
  • a 打开(或创建)文件写入数据,若文件存在则清零,数据流位置在文件结尾处,此后的写操作豆浆数据追加到文件后面
  • a+ 打开(或创建)文件读写数据,若文件存在则清零,数据流位置在文件结尾处,此后的写操作豆浆数据追加到文件后面

7.4 读写文件

读取文件前必须创建一个缓冲区来放置数据,缓冲区被传递到充满文件数据的+s.read函数
fs.read(fd, buffer, offset, length, position, callback)
fs.write(fd, buffer[, offset[, length[, position]]], callback)
position: 文件起始位置,null:从当前文件的游标处开始,追加模式打开的文件游标位于文件的结尾处。

var fs = require('fs');
fs.open('.\\fs_open.js', 'r', function(err, fd) {
	if(err) { throw err }
	var readBuffer = new Buffer(1024),
	bufferOffset = 0,
	bufferLength = readBuffer.length,
	filePosition = 10;
	fs.read(fd, readBuffer, bufferOffset, bufferLength, filePosition, function read(err, readBytes) {
		if(err) { throw err; }
			console.log('just read ' + readBytes + ' bytes');
		if(readBytes) 
			console.log(readBuffer.slice(0, readBytes));
	});
});

fs.open('./hello.txt', 'a', function opened(err, fd){
	if(err) { throw err; }
	var writeBuffer = new Buffer('writing hello world'),
	bufferPosition = 0,
	bufferLength = writeBuffer.length,
	filePosition = null;
	fs.write(fd, writeBuffer, bufferPosition, bufferLength, filePosition, function wrote(err, written, buffer) {
		if (err) { throw err; }
		console.log('wrote ' + written + ' bytes\n' + buffer.toString());
	});
});
var buf = new Buffer('我喜爱编程');
fs.open('./mess.txt','w',function(err,fd){
	fs.write(fd,buf,3,9,0,function(err,written,buffer){
		fs.write(fd,buf,12,3,null,function(err,written, buffer){
			if(err) console.log('fail to write!');
			console.log('succeed to write ' + written + ' bytes');
		});
	});
});
fs.writeSync(fd,buf,3,9,0);//同步写入
});

关闭文件(描述符)
fs.close(fd[,callback]);

7.5 打开、读写和关闭文件

7.6 避免文件描述符泄露

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值