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]);