ホームページ > 記事 > ウェブフロントエンド > Node.js の文字列検索 function_node.js の簡単な分析
要件は次のとおりです:
ディレクトリ全体で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"); }
2 つのパラメータ: 最初のパラメータは「フォルダ名」、2 番目のパラメータは「探している文字列」です
写真:
ファイル パスを出力して完了です。それでは終わりです。そのスピードは本当に凄まじく、目もくらむほどです。 。 。 Javaの全文検索を使うと大変なことになります…
Nodejs の検索、ファイルの読み取りと書き込み
(1)、パス処理
1. まず、ファイル パスの正規化に注意する必要があります。nodejs は、パスの正規化に役立つ Path モジュールを提供します。
var path = require('path'); path.normalize('/foo/bar/nor/faz/..'); -> /foo/bar/nor
var path = require('path'); path.join('/foo', 'bar', 'baz/asdf', 'quux', '..'); ->/foo/bar/baz/asdf
var path = require('path'); path.resolve('/foo/bar', './baz'); ->/foo/bar/baz path.resolve('/foo/bar', '/tmp/file/'); ->/tmp/file
var path = require('path'); path.relative('/data/orandea/test/aaa', '/data/orandea/impl/bbb'); ->../../impl/bbb
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 の 2 番目のパラメータを渡すだけです。パラメータはサフィックス名です。例:
var path = require('path');
path.basename('/foo/bar/baz/asdf/quux.html', '.html');
もちろん、ファイル パスにはさまざまなファイルが存在する可能性があり、必要な結果を得るためにサフィックスをハードコーディングすることは不可能です。
サフィックス名を取得するのに役立つメソッドがあります:
path.extname('/a/b/index.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(パス);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 }
2 番目のパラメータは操作タイプです:
stats.isFile(); stats.isDirectory(); stats.isBlockDevice(); stats.isCharacterDevice(); stats.isSymbolicLink(); stats.isFifo(); stats.isSocket(); .读写文件 fs.open('/path/to/file', 'r', function(err, fd) { // todo });
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'); }); });