浅析Node.js查找字符串功能


Posted in Javascript onSeptember 03, 2014

需求如下:

整个目录下大概有40几M,文件无数,由于时间久了, 记不清那个字符串具体在哪个文件,于是。强大,亮瞎双眼的Node.js闪亮登场:

windows下安装Node.js和安装普通软件毫无差别,装完后打开Node.js的快捷方式,或者直接cmd,你懂的。

创建findString.js

var path = require("path");

var fs = require("fs");


var filePath = process.argv[2];

var lookingForString = process.argv[3];

recursiveReadFile(filePath);


function recursiveReadFile(fileName){

if(!fs.existsSync(fileName)) return;

if(isFile(fileName)){

check(fileName);

}

if(isDirectory(fileName)){

var files = fs.readdirSync(fileName);

files.forEach(function(val,key){

var temp = path.join(fileName,val);

if(isDirectory(temp)) recursiveReadFile(temp);

if (isFile(temp)) check(temp);

})

}

}

function check(fileName){

var data = readFile(fileName);

var exc = new RegExp(lookingForString);

if(exc.test(data))

console.log(fileName);


}

function isDirectory(fileName){

if(fs.existsSync(fileName)) return fs.statSync(fileName).isDirectory();

}

function isFile(fileName){

if(fs.existsSync(fileName)) return fs.statSync(fileName).isFile();

}

function readFile(fileName){

if(fs.existsSync(fileName)) return fs.readFileSync(fileName,"utf-8");

}

两个参数:第一个参数为“文件夹名称” 第二个参数为“你要查找的字符串”

如图:

浅析Node.js查找字符串功能

打印出文件路径,完事,收工。速度实在是彪悍,亮瞎双眼。。。如果采用java全文搜索,你惨了...

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.读取文件状态信息

fs.stat(path, function(err, stats) {
  if (err) { throw err;}
  console.log(stats);
});

控制台输出states的内容大致如下:

{ dev: 234881026,
 ino: 95028917,
 mode: 33188,
 nlink: 1,
 uid: 0,
 gid: 0,
 rdev: 0,
 size: 5086,
 blksize: 4096,
blocks: 0,
atime: Fri, 18 Nov 2011 22:44:47 GMT,
mtime: Thu, 08 Sep 2011 23:50:04 GMT,
ctime: Thu, 08 Sep 2011 23:50:04 GMT }

同时,stats还具有一些方法,比如:

stats.isFile();
stats.isDirectory();
stats.isBlockDevice();
stats.isCharacterDevice();
stats.isSymbolicLink();
stats.isFifo();
stats.isSocket();
.读写文件

fs.open('/path/to/file', 'r', function(err, fd) {

// todo

});

第二个参数为操作类型:

r : 只读

r+ : 读写

w : 重写文件

w+ : 重写文件,如果文件不存在则创建

a : 读写文件,在文件末尾追加

a+ : 读写文件,如果文件不存在则创建

下面为一个读取文件的小例子:

var fs = require('fs');
 fs.open('./nodeRead.html', 'r', function opened(err, fd) {
 if (err) { throw err }
   var readBuffer = new Buffer(1024),
   bufferOffset = 0,
   bufferLength = readBuffer.length,
   filePosition = 100;
   fs.read(fd,
     readBuffer,
    bufferOffset,
    bufferLength,
    filePosition,
    function read(err, readBytes) {
    if (err) { throw err; }
    console.log('just read ' + readBytes + ' bytes');
    if (readBytes > 0) {
      console.log(readBuffer.slice(0, readBytes));
    }
  });
});

下面为一个写文件的小例子:

var fs = require('fs');
 fs.open('./my_file.txt', 'a', function opened(err, fd) {
   if (err) { throw err; }
   var writeBuffer = new Buffer('hello, world!'),
   bufferPosition = 0,
   bufferLength = writeBuffer.length, filePosition = null;
   fs.write( fd,
     writeBuffer,
     bufferPosition,
    bufferLength,
    filePosition,
    function(err, written) {
      if (err) { throw err; }
      console.log('wrote ' + written + ' bytes');
  });
});

对于文件的读写操作,我们不应该忘记在这些操作都完成之后执行关闭操作,即close(); 下面是一个封装的方法,其中就包括了文件的后期关闭操作,使用起来方便:

var fs = require('fs');
 function openAndWriteToSystemLog(writeBuffer, callback) {
   fs.open('./my_file', 'a', function(err, fd) {
     if (err) { return callback(err); }
     function notifyError(err) {
       fs.close(fd, function() {
         callback(err);
       });
     }
    var bufferOffset = 0,
    bufferLength = writeBuffer.length,
    filePosition = null;
    fs.write( fd, writeBuffer, bufferOffset, bufferLength, filePosition,function(err, written) {
      if (err) { return notifyError(err); }
      fs.close(fd, function() {
        callback(err);
      });
    });
  });
}
openAndWriteToSystemLog(new Buffer('writing this string'),function(err) {
  if (err) {
    console.log("error while opening and writing:", err.message);
    return;
  }
  console.log('All done with no errors');
});
Javascript 相关文章推荐
javascript 强制刷新页面的实现代码
Dec 13 Javascript
javascript parseInt与Number函数的区别
Jan 21 Javascript
从零学JS之你需要了解的几本书
May 19 Javascript
原生JS实现美图瀑布流布局赏析
Sep 07 Javascript
jquery validate表单验证的基本用法入门
Jan 18 Javascript
基于jQuery Ajax实现上传文件
Mar 24 Javascript
JavaScript中apply方法的应用技巧小结
Sep 29 Javascript
JS+CSS实现下拉刷新/上拉加载插件
Mar 31 Javascript
JS HTML图片显示Canvas 压缩功能
Jul 21 Javascript
vue-cli2 构建速度优化的实现方法
Jan 08 Javascript
微信小程序仿淘宝热搜词在搜索框中轮播功能
Jan 21 Javascript
vue 使用v-for进行循环的实例代码详解
Feb 19 Javascript
Node.js实现在目录中查找某个字符串及所在文件
Sep 03 #Javascript
iframe如何动态创建及释放其所占内存
Sep 03 #Javascript
Javascript正则控制文本框只能输入整数或浮点数
Sep 02 #Javascript
jquery制作select列表双向选择示例代码
Sep 02 #Javascript
一个获取第n个元素节点的js函数
Sep 02 #Javascript
indexOf 和 lastIndexOf 使用示例介绍
Sep 02 #Javascript
jquery实现个人中心导航菜单效果和美观都非常不错
Sep 02 #Javascript
You might like
谨慎使用PHP的引用原因分析
2012/09/06 PHP
zend framework配置操作数据库实例分析
2012/12/06 PHP
php实现利用phpexcel导出数据
2013/08/24 PHP
ASP Json Parser修正版
2009/12/06 Javascript
基于jquery的滑动样例代码
2010/11/20 Javascript
设为首页和收藏的Javascript代码(亲测兼容IE,Firefox,chrome等浏览器)
2013/11/18 Javascript
jQuery可见性过滤器:hidden和:visibility用法实例
2015/06/24 Javascript
js生成随机数的方法实例
2015/10/16 Javascript
JavaScript统计网站访问次数的实现代码
2015/11/18 Javascript
微信小程序表单验证错误提示效果
2017/05/19 Javascript
利用vueJs实现图片轮播实例代码
2017/06/03 Javascript
jQuery实现QQ空间汉字转拼音功能示例
2017/07/10 jQuery
Angular2管道Pipe及自定义管道格式数据用法实例分析
2017/11/29 Javascript
微信小程序基于本地缓存实现点赞功能的方法
2017/12/18 Javascript
使用vue-router与v-if实现tab切换遇到的问题及解决方法
2018/09/07 Javascript
原生JavaScript实现购物车
2021/01/10 Javascript
Windows下用py2exe将Python程序打包成exe程序的教程
2015/04/08 Python
python中pika模块问题的深入探究
2018/10/13 Python
python 一个figure上显示多个图像的实例
2019/07/08 Python
浅谈Python type的使用
2019/11/19 Python
python创建n行m列数组示例
2019/12/02 Python
Pycharm2020.1安装中文语言插件的详细教程(不需要汉化)
2020/08/07 Python
opencv python 对指针仪表读数识别的两种方式
2021/01/14 Python
删除pycharm鼠标右键快捷键打开项目的操作
2021/01/16 Python
html5使用Drag事件编辑器拖拽上传图片的示例代码
2017/08/22 HTML / CSS
美国肌肉和力量商店:Muscle & Strength
2019/06/22 全球购物
美国购买体育、音乐会和剧院门票网站:SelectATicket
2019/09/08 全球购物
战友聚会邀请函
2014/01/18 职场文书
工艺员岗位职责
2014/02/11 职场文书
詹天佑教学反思
2014/04/30 职场文书
中学教师师德承诺书
2014/05/23 职场文书
计算机售后服务承诺书
2014/05/30 职场文书
领导班子四风问题个人对照检查材料
2014/10/04 职场文书
幼儿园教师考核评语
2014/12/31 职场文书
python+opencv实现视频抽帧示例代码
2021/06/11 Python
linux目录管理方法介绍
2022/06/01 Servers