浅析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 相关文章推荐
阻止子元素继承父元素事件具体思路及实现
May 02 Javascript
php的文件上传入门教程(实例讲解)
Apr 10 Javascript
使用jquery animate创建平滑滚动效果(可以是到顶部、到底部或指定地方)
May 27 Javascript
一个简单的jQuery计算器实现了连续计算功能
Jul 21 Javascript
jQuery实现仿QQ在线客服效果的滚动层代码
Oct 15 Javascript
jquery基本选择器匹配多个元素的实现方法
Sep 05 Javascript
解决Mac安装thrift因bison报错的问题
May 17 Javascript
json字符串传到前台input的方法
Aug 06 Javascript
JS+CSS实现3D切割轮播图
Mar 21 Javascript
ant design vue中日期选择框混合时间选择器的用法说明
Oct 27 Javascript
Nest.js 授权验证的方法示例
Feb 22 Javascript
vue postcss-px2rem 自适应布局
May 15 Vue.js
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 session_start()出错原因分析及解决方法
2013/10/28 PHP
laravel-admin 中列表筛选方法
2019/10/03 PHP
Yii使用DbTarget实现日志功能的示例代码
2020/07/21 PHP
JavaScript 异步方法队列链实现代码分析
2010/06/05 Javascript
js 实现图片预加载(js操作 Image对象属性complete ,事件onload 异步加载图片)
2011/03/25 Javascript
用RadioButten或CheckBox实现div的显示与隐藏
2013/09/21 Javascript
js禁止页面刷新禁止用F5键刷新禁止右键的示例代码
2013/09/23 Javascript
使用js实现关闭js弹出层的窗口
2014/02/10 Javascript
Javascript前端UI框架Kit使用指南之kitjs的对话框组件
2014/11/28 Javascript
使用jQuery调用XML实现无刷新即时聊天
2016/08/07 Javascript
jQuery多个版本和其他js库冲突的解决方法
2016/08/11 Javascript
vue中如何实现后台管理系统的权限控制的方法示例
2018/09/19 Javascript
JavaScript实现秒杀时钟倒计时
2019/09/29 Javascript
JavaScript实现简单的计算器
2020/01/16 Javascript
使用TS来编写express服务器的方法步骤
2020/10/29 Javascript
Python中每次处理一个字符的5种方法
2015/05/21 Python
Linux下将Python的Django项目部署到Apache服务器
2015/12/24 Python
Python使用ntplib库同步校准当地时间的方法
2016/07/02 Python
Python模块文件结构代码详解
2018/02/03 Python
小白入门篇使用Python搭建点击率预估模型
2018/10/12 Python
Python判断对象是否为文件对象(file object)的三种方法示例
2019/04/26 Python
Python3列表内置方法大全及示例代码小结
2019/05/10 Python
python GUI库图形界面开发之PyQt5滑块条控件QSlider详细使用方法与实例
2020/02/28 Python
windows下Pycharm安装opencv的多种方法
2020/03/05 Python
python实例化对象的具体方法
2020/06/17 Python
Python自带的IDE在哪里
2020/07/01 Python
python自动生成sql语句的脚本
2021/02/24 Python
中学教师实习自我鉴定
2013/09/28 职场文书
《理想的风筝》教学反思
2014/04/11 职场文书
赔偿协议书范本
2014/04/15 职场文书
会计专业自荐信
2014/06/03 职场文书
2014房屋登记授权委托书
2014/10/13 职场文书
2014年安全管理工作总结
2014/12/01 职场文书
六一领导慰问欢迎词
2015/01/26 职场文书
英文自荐信范文
2015/03/25 职场文书
css3 实现文字闪烁效果的三种方式示例代码
2021/04/25 HTML / CSS