>웹 프론트엔드 >JS 튜토리얼 >Node.js 문자열 검색에 대한 간략한 분석 function_node.js

Node.js 문자열 검색에 대한 간략한 분석 function_node.js

WBOY
WBOY원래의
2016-05-16 16:37:471973검색

요구사항은 다음과 같습니다.

전체 디렉터리에 40M 정도 있고, 파일도 셀 수 없이 많아서 오래되어서 어느 파일에 문자열이 들어 있는지 기억이 나지 않습니다. 강력하고 눈부신 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 문자열 검색에 대한 간략한 분석 function_node.js

파일 경로를 인쇄하고 완료하고 하루를 보내세요. 속도가 정말 맹렬하고 눈이 부시네요. . . 자바 전문검색을 이용하시면 곤란합니다...

Nodejs 파일 검색, 읽기 및 쓰기

(1), 경로 처리

1. 우선 파일 경로의 정규화에 주의해야 합니다. nodejs는 Path 모듈을 제공하여 경로를 정규화하는 데 도움을 줄 수 있습니다.

var path = require('path');

path.normalize('/foo/bar/nor/faz/..'); -> /foo/bar/nor

2. 물론 조인 병합 경로도 있습니다:

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 경로 = 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(경로, 함수(존재) {});

위 인터페이스는 비동기식으로 작동하므로 다양한 작업을 처리할 수 있는 콜백 함수가 있습니다. 동기식 작업이 필요한 경우 다음 방법을 사용할 수 있습니다.

fs.existsSync(경로);

2. 파일 상태 정보 읽기

콘솔 출력 상태의 내용은 대략 다음과 같습니다.
fs.stat(path, function(err, stats) {
  if (err) { throw err;}
  console.log(stats);
});

 { 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.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));
    }
  });
});
다음은 파일 작성의 간단한 예입니다.


파일 읽기 및 쓰기 작업의 경우 이러한 작업이 완료된 후 닫기 작업을 수행하는 것을 잊지 말아야 합니다. 즉, close() 다음은 나중에 파일을 닫는 작업을 포함하는 캡슐화된 메서드입니다. 사용하기 편리합니다:
 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');
  });
});

 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');
});
성명:
본 글의 내용은 네티즌들의 자발적인 기여로 작성되었으며, 저작권은 원저작자에게 있습니다. 본 사이트는 이에 상응하는 법적 책임을 지지 않습니다. 표절이나 침해가 의심되는 콘텐츠를 발견한 경우 admin@php.cn으로 문의하세요.