浅析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 相关文章推荐
js 第二代身份证号码的验证机制代码
May 12 Javascript
jquery动画2.元素坐标动画效果(创建一个图片走廊)
Aug 24 Javascript
window.open以post方式将内容提交到新窗口
Dec 26 Javascript
jQuery与JS加载事件用法分析
Sep 04 Javascript
Vue通过input筛选数据
Oct 26 Javascript
JavaScript常用截取字符串的三种方式用法区别实例解析
May 15 Javascript
jQuery实现基本隐藏与显示效果的方法详解
Sep 05 jQuery
vue中使用input[type="file"]实现文件上传功能
Sep 10 Javascript
Node.js操作系统OS模块用法分析
Jan 04 Javascript
vue+element加入签名效果(移动端可用)
Jun 17 Javascript
js中的面向对象之对象常见创建方法详解
Dec 16 Javascript
js获取url页面id,也就是最后的数字文件名
Sep 25 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
全国FM电台频率大全 - 25 云南省
2020/03/11 无线电
解析如何屏蔽php中的phpinfo()函数
2013/06/06 PHP
PHP单例模式简单用法示例
2017/06/23 PHP
PHP排序二叉树基本功能实现方法示例
2018/05/26 PHP
PHP SESSION跨页面传递失败解决方案
2020/12/11 PHP
jQuery 获取对象 定位子对象
2010/05/31 Javascript
js获取下拉列表的值和元素个数示例
2014/05/07 Javascript
jQuery不兼容input的change事件问题解决过程
2014/12/05 Javascript
BootStrap modal模态弹窗使用小结
2016/10/26 Javascript
微信小程序  Mustache语法详细介绍
2016/10/27 Javascript
AngularJS入门教程之数据绑定用法示例
2016/11/01 Javascript
jquery 标签 隔若干行加空白或者加虚线的方法
2016/12/07 Javascript
详解angularJS动态生成的页面中ng-click无效解决办法
2017/06/19 Javascript
详解在Vue中有条件地使用CSS类
2017/09/30 Javascript
vue-router路由与页面间导航实例解析
2017/11/07 Javascript
浅谈webpack打包过程中因为图片的路径导致的问题
2018/02/21 Javascript
vue项目tween方法实现返回顶部的示例代码
2018/03/02 Javascript
vue中设置height:100%无效的问题及解决方法
2018/07/27 Javascript
vue之debounce属性被移除及处理详解
2019/11/13 Javascript
使用wxpython实现的一个简单图片浏览器实例
2014/07/10 Python
python网络编程之文件下载实例分析
2015/05/20 Python
Python实现的质因式分解算法示例
2018/05/03 Python
Python greenlet和gevent使用代码示例解析
2020/04/01 Python
空字符串(“”)和null的区别
2012/11/13 面试题
C++面试题:关于链表和指针
2013/06/05 面试题
自荐信格式的六要素
2013/09/21 职场文书
实习单位推荐信范文
2013/11/27 职场文书
自动一体化专业求职信
2014/03/15 职场文书
保护环境标语
2014/06/09 职场文书
2014第二批党员干部对照“四风”找差距检查材料思想汇报
2014/09/18 职场文书
安全生产月宣传标语
2014/10/06 职场文书
学校党的群众路线教育实践活动个人整改方案
2014/10/31 职场文书
同意报考公务员证明
2015/06/17 职场文书
毕业欢送会致辞
2015/07/29 职场文书
房产遗嘱范本
2015/08/06 职场文书
高考升学宴主持词
2019/06/21 职场文书