浅析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 28 Javascript
js 阻止子元素响应父元素的onmouseout事件具体实现
Dec 23 Javascript
详解JavaScript正则表达式中的global属性的使用
Jun 16 Javascript
js实现分割上传大文件
Mar 09 Javascript
开启BootStrap学习之旅
May 04 Javascript
jQuery实现动态文字搜索功能
Jan 05 Javascript
使用 Node.js 开发资讯爬虫流程
Jan 07 Javascript
JavaScript中的E-mail 地址格式验证
Mar 28 Javascript
layui框架与SSM前后台交互的方法
Sep 12 Javascript
layui加载数据显示loading加载完成loading消失的实例代码
Sep 23 Javascript
vue 组件开发原理与实现方法详解
Nov 29 Javascript
jQuery事件模型默认行为执行顺序及trigger()与 triggerHandler()比较实例分析
Apr 30 jQuery
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 Coding Tips(php小技巧)[2011/04/02最后更新]
2011/05/02 PHP
在WINDOWS中设置计划任务执行PHP文件的方法
2011/12/19 PHP
深入HTTP响应状态码速查表的详解
2013/06/07 PHP
PHP中变量引用与变量销毁机制分析
2014/11/15 PHP
PHP正则表达式过滤html标签属性(DEMO)
2016/05/04 PHP
深入分析PHP优化及注意事项
2016/07/04 PHP
在JavaScript里嵌入大量字符串常量的实现方法
2013/07/07 Javascript
JS实现OCX控件的事件响应示例
2014/09/17 Javascript
JavaScript将Web页面内容导出到Word及Excel的方法
2015/02/13 Javascript
javascript实现获取浏览器版本、浏览器类型
2015/12/02 Javascript
JQuery EasyUI的使用
2016/02/24 Javascript
Node.js实用代码段之获取Buffer对象字节长度
2016/03/17 Javascript
jQuery Jsonp跨域模拟搜索引擎
2017/06/17 jQuery
Vue2.0如何发布项目实战
2017/07/27 Javascript
详解vue2 $watch要注意的问题
2017/09/08 Javascript
浅谈Node 调试工具入门教程
2018/03/20 Javascript
React中使用async validator进行表单验证的实例代码
2018/08/17 Javascript
js html实现计算器功能
2018/11/13 Javascript
vue 组件基础知识总结
2021/01/26 Vue.js
压缩包密码破解示例分享(类似典破解)
2014/01/17 Python
Python使用面向对象方式创建线程实现12306售票系统
2015/12/24 Python
python中函数默认值使用注意点详解
2016/06/01 Python
浅谈Series和DataFrame中的sort_index方法
2018/06/07 Python
Python使用itchat模块实现简单的微信控制电脑功能示例
2019/08/26 Python
努比亚手机官网:nubia
2016/10/06 全球购物
高中自我鉴定
2013/12/20 职场文书
保密工作实施方案
2014/02/24 职场文书
小学数学国培感言
2014/03/10 职场文书
医院深入开展党的群众路线教育实践活动实施方案
2014/08/27 职场文书
2015年安全生产月活动总结
2015/03/26 职场文书
2015年售后服务工作总结
2015/04/25 职场文书
上课讲话检讨书范文
2015/05/07 职场文书
写作技巧:怎样写好一份优秀工作总结?
2019/08/14 职场文书
springboot集成flyway自动创表的详细配置
2021/06/26 Java/Android
《艾尔登法环》发布最新「战技」宣传片
2022/04/03 其他游戏
Java中的Kafka为什么性能这么快及4大核心详析
2022/09/23 Java/Android