首页 > 代码库 > Nodejs查找,读写文件
Nodejs查找,读写文件
Nodejs查找,读写文件
(1),路径处理
1.首先,我们需要注意的文件路径的规范化,nodejs给我们提供了Path模块,normolize方法能帮我们规范化路径:
var path = require(‘path‘);
path.normalize(‘/foo/bar/nor/faz/..‘); -> /foo/bar/nor
2.当然还有join合并路径:
var path = require(‘path‘);
path.join(‘/foo‘, ‘bar‘, ‘baz/asdf‘, ‘quux‘, ‘..‘); ->/foo/bar/baz/asdf
3.解析路径
var path = require(‘path‘);
path.resolve(‘/foo/bar‘, ‘./baz‘); ->/foo/bar/baz
path.resolve(‘/foo/bar‘, ‘/tmp/file/‘); ->/tmp/file
4.在两个相对路径间查找相对路径
var path = require(‘path‘);
path.relative(‘/data/orandea/test/aaa‘, ‘/data/orandea/impl/bbb‘); ->../../impl/bbb
5.抽离路径
var path = require(‘path‘);
path.dirname(‘/foo/bar/baz/asdf/quux.txt‘); ->/foo/bar/baz/asdf
=================
var path = require(‘path‘);
path.basename(‘/foo/bar/baz/asdf/quux.html‘) ->quux.html
甚至你还还可以将后缀名去掉,只需要在basename中传入第二个参数,参数为后缀名,例如:
var path = require(‘path‘);
path.basename(‘/foo/bar/baz/asdf/quux.html‘, ‘.html‘); ->quux
当然文件路径中可能会存在各种不同的文件,我们不可能硬编码后缀来得到我们想要的结果,
所以有一个方法能帮我们得到后缀名:
path.extname(‘/a/b/index.html‘); // => ‘.html‘
path.extname(‘/a/b.c/index‘); // => ‘‘
path.extname(‘/a/b.c/.‘); // => ‘‘
path.extname(‘/a/b.c/d.‘); // => ‘.‘
(2),文件处理
var fs = require(‘fs‘);
1.判断文件是否存在
fs.exists(path, function(exists) {});
上面的接口为异步操作的,因此有回调函数,在回调中可以处理我们的各种操作,如果需要同步操作可以用下面的方法:
fs.existsSync(path);
2.读取文件状态信息
1 fs.stat(path, function(err, stats) {2 if (err) { throw err;}3 console.log(stats);4 });
控制台输出states的内容大致如下:
1 { dev: 234881026, 2 ino: 95028917, 3 mode: 33188, 4 nlink: 1, 5 uid: 0, 6 gid: 0, 7 rdev: 0, 8 size: 5086, 9 blksize: 4096,10 blocks: 0,11 atime: Fri, 18 Nov 2011 22:44:47 GMT,12 mtime: Thu, 08 Sep 2011 23:50:04 GMT,13 ctime: Thu, 08 Sep 2011 23:50:04 GMT }
同时,stats还具有一些方法,比如:
1 stats.isFile();2 stats.isDirectory();3 stats.isBlockDevice();4 stats.isCharacterDevice();5 stats.isSymbolicLink();6 stats.isFifo();7 stats.isSocket();
3.读写文件
fs.open(‘/path/to/file‘, ‘r‘, function(err, fd) {
// todo
});
第二个参数为操作类型:
r : 只读
r+ : 读写
w : 重写文件
w+ : 重写文件,如果文件不存在则创建
a : 读写文件,在文件末尾追加
a+ : 读写文件,如果文件不存在则创建
下面为一个读取文件的小例子:
1 var fs = require(‘fs‘); 2 fs.open(‘./nodeRead.html‘, ‘r‘, function opened(err, fd) { 3 if (err) { throw err } 4 var readBuffer = new Buffer(1024), 5 bufferOffset = 0, 6 bufferLength = readBuffer.length, 7 filePosition = 100; 8 fs.read(fd, 9 readBuffer,10 bufferOffset,11 bufferLength,12 filePosition,13 function read(err, readBytes) {14 if (err) { throw err; }15 console.log(‘just read ‘ + readBytes + ‘ bytes‘);16 if (readBytes > 0) {17 console.log(readBuffer.slice(0, readBytes));18 }19 });20 });
下面为一个写文件的小例子:
1 var fs = require(‘fs‘); 2 fs.open(‘./my_file.txt‘, ‘a‘, function opened(err, fd) { 3 if (err) { throw err; } 4 var writeBuffer = new Buffer(‘hello, world!‘), 5 bufferPosition = 0, 6 bufferLength = writeBuffer.length, filePosition = null; 7 fs.write( fd, 8 writeBuffer, 9 bufferPosition,10 bufferLength,11 filePosition,12 function(err, written) {13 if (err) { throw err; }14 console.log(‘wrote ‘ + written + ‘ bytes‘);15 });16 });
对于文件的读写操作,我们不应该忘记在这些操作都完成之后执行关闭操作,即close();
下面是一个封装的方法,其中就包括了文件的后期关闭操作,使用起来方便:
1 var fs = require(‘fs‘); 2 function openAndWriteToSystemLog(writeBuffer, callback) { 3 fs.open(‘./my_file‘, ‘a‘, function(err, fd) { 4 if (err) { return callback(err); } 5 function notifyError(err) { 6 fs.close(fd, function() { 7 callback(err); 8 }); 9 }10 var bufferOffset = 0,11 bufferLength = writeBuffer.length,12 filePosition = null;13 fs.write( fd, writeBuffer, bufferOffset, bufferLength, filePosition,function(err, written) {14 if (err) { return notifyError(err); }15 fs.close(fd, function() {16 callback(err);17 });18 });19 });20 }21 openAndWriteToSystemLog(new Buffer(‘writing this string‘),function(err) {22 if (err) {23 console.log("error while opening and writing:", err.message);24 return;25 }26 console.log(‘All done with no errors‘);27 });