浅析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入门教程(5) js Screen屏幕对象
Jan 31 Javascript
用JavaScript计算在UTF-8下存储字符串占用字节数
Aug 08 Javascript
使用Node.js实现一个简单的FastCGI服务器实例
Jun 09 Javascript
深入理解JavaScript系列(42):设计模式之原型模式详解
Mar 04 Javascript
js实现数组冒泡排序、快速排序原理
Mar 08 Javascript
JS实现获取剪贴板内容的方法
Jun 21 Javascript
浅谈在vue项目中如何定义全局变量和全局函数
Oct 24 Javascript
vue.js中导出Excel表格的案例分析
Jun 11 Javascript
Webpack 4如何动态切割JS注入文件名详解
Jul 09 Javascript
js实现无限瀑布流实例方法
Sep 16 Javascript
jQuery操作事件完整实例分析
Jan 10 jQuery
详解Vue.js 响应接口
Jul 04 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
风格模板初级不完全修改教程
2006/10/09 PHP
php 图片加水印与上传图片加水印php类
2010/05/12 PHP
thinkPHP多语言切换设置方法详解
2016/11/11 PHP
PHP基于简单递归函数求一个数阶乘的方法示例
2017/04/26 PHP
jquery 读取页面load get post ajax 四种方式代码写法
2011/04/02 Javascript
js调用图片隐藏&显示实现代码
2013/09/13 Javascript
JS 如何获取radio选中后的值及不选择取radio的值
2013/10/28 Javascript
必备的JS调试技巧汇总
2016/07/20 Javascript
js限制输入框只能输入数字(onkeyup触发)
2018/09/28 Javascript
详解关于element级联选择器数据回显问题
2019/02/20 Javascript
Vue实现数据表格合并列rowspan效果
2020/11/30 Javascript
Vue实现购物车实例代码两则
2020/05/30 Javascript
JS相册图片抖动放大展示效果的示例代码
2021/01/29 Javascript
用Python输出一个杨辉三角的例子
2014/06/13 Python
Python 3.6 读取并操作文件内容的实例
2018/04/23 Python
使用Python实现文字转语音并生成wav文件的例子
2019/08/08 Python
python各类经纬度转换的实例代码
2019/08/08 Python
python实现PID算法及测试的例子
2019/08/08 Python
python opencv鼠标事件实现画框圈定目标获取坐标信息
2020/04/18 Python
python:动态路由的Flask程序代码
2019/11/22 Python
Pytorch 实现数据集自定义读取
2020/01/18 Python
解决tensorflow打印tensor有省略号的问题
2020/02/04 Python
opencv 图像腐蚀和图像膨胀的实现
2020/07/07 Python
TIME时代杂志台湾总代理:台时亚洲
2018/10/22 全球购物
联想C++笔试题
2012/06/13 面试题
若干个Java基础面试题
2015/05/19 面试题
计算机通信工程专业毕业生推荐信
2013/12/24 职场文书
党的群众路线教育实践活动个人自我剖析材料
2014/10/07 职场文书
乡镇党的群众路线教育实践活动个人整改方案
2014/10/31 职场文书
2014年初中班主任工作总结
2014/11/08 职场文书
出生公证书
2015/01/23 职场文书
就业推荐表自我评价范文
2015/03/02 职场文书
时尚女魔头观后感
2015/06/04 职场文书
莫言获奖感言(全文)
2015/07/31 职场文书
2016年校园社会综合治理宣传月活动总结
2016/03/16 职场文书
创业计划书之餐饮
2019/09/02 职场文书