gorogoronyan FC2

Node.js: はじめの一歩 (2)

ファイルやディレクトリのリストの取得

その1

File System の関数 fs.readdirSync(), fs.readdir() でファイル名やディレクトリ名のリストが得られます。
Node.js v12.18.4: fs.readdirSync

/* 
node TestNodejs_fs_readdirSync1.js
ファイル名、ディレクトリ名のリストを出力する
*/
const FS = require("fs");
const list = FS.readdirSync(".");  //ピリオド . は現在のディレクトリを表す
for (const filename of list){
    console.log(filename);
}

実行例 (Windows10)
実行例 (Windows10)

その2

ディレクトリ名だけを出力するサンプルです。 fs.statsSync() で Stats オブジェクトを取得して isFile() や isDirectory() でファイルの種類を識別します。 ファイルのアクセス権限によってはエラー (例外) が出るので、必要であれば例外処理をします。

Node.js v12.18.4: statSync()
Node.js v12.18.4: Class: fs.Stats
/* 
node TestNodejs_fs_dir2.js
ディレクトリ名を出力する
*/
const FS = require("fs");
const PATH = require("path");

// Windows の C:\ にあるディレクトリ名を取得
const dir = "C:\\";

const list = FS.readdirSync(dir);
for (const filename of list){
    const path = PATH.join(dir, filename);
    try {
        const st = FS.statSync(path);
        if (st.isDirectory(path)){
            console.log(path);
        }
    }
    catch(e){
        //アクセス権限がない場合、FS.statSync() で例外が出る。
        console.error("エラー:"+ e.message);
        //console.error("エラー:"+ e.stack);  //エラーの発生した行番号を表示
    }
}

実行例 (Windows10)
実行例 (Windows10)

リダイレクトでテキストファイルに保存する

プログラムを実行するときに、コマンド文字列の最後に > (ファイル名) を付けると、 コンソールに出力される文字列が (ファイル名) のファイルに保存されます (リダイレクト)。
コマンドプロンプト リダイレクト
Wikipedia: リダイレクト (CLI)

例:処理結果をファイル result.txt に保存する
node TestNodejs_fs_readdirSync1.js > result.txt

Windows のプロンプトでは、 テキストファイル名だけ入力してエンターキーを押すと、 テキストファイルをメモ帳など関連付けられたアプリケーションで開く ことができます。
コマンドプロンプト テキストファイルや画像ファイルなどを開く

console.log() と console.error()

console.log() で出力した文字列は、 リダイレクトでファイルに保存することができます (標準出力)。 console.error() で出力した文字列は、 リダイレクトの場合でもコンソールに文字列が表示され、 ファイルには保存されません (エラー出力)。

リダイレクトのときの文字コード

Windows のプロンプトでリダイレクト処理するときの注意点です。

Node.js のプログラムでは、console.log() で日本語文字をコンソールに出力して リダイレクトで保存したテキストファイルの文字コードは utf-8 になります(シフトJIS ではない点に注意)。

一方、Windows のコマンド (dirなど) でリダイレクト保存した テキストファイルの文字コードはシフトJIS になります。 Windows のコマンドと node.js を組み合わせて処理する場合は、 日本語のファイル名など文字コードに注意が必要です。
Node.js: テキストの処理 (1)

Sync ありの関数、Sync なしの関数

Node.js の関数で、1) Sync が付いてる関数と 2) Sync が付いてない関数の 2種類が用意されている場合があります。

例1
  fs.read()       Syncなし関数
  fs.readSync()   Syncあり関数

例2
  fs.stat()       Syncなし関数
  fs.statSync()   Syncあり関数

コードの実行順序が分かりやすいのは、Syncあり関数です。 上のサンプルのように手続きを並べただけの分かりやすい プログラムが書けます。

Sync なし関数は処理結果を待たずに次の行の処理に移るので、 慣れていないと処理の順番などで混乱すると思います。 プログラムもコールバックを多用した複雑な書き方をします。
JavaScript コールバック処理

Sync なし関数の用途

Node.js はサーバー上で使うことを意識しているので、 Sync (同期)をなるべく使わず、Syncなし関数を多用した サンプルがよく出てきます。 こちらはサーバーを効率よく動かすための工夫です。 業務用の濃い話なので、 お手軽プラグラミングで気にする必要はありません。

Sync なし関数は待ち状態をなるべく作らないようにしたり、 メモリを効率良く使用したりする目的で使用します。 Sync あり関数は処理内容によっては結果が帰ってくるまでに時間がかかるものがあり、 CPU の待機時間が増えて効率が悪くなることがあります。 また、処理の内容によってはメモリを大量に消費することもあります。 Syncなし関数を上手に使うことで CPU やサーバーの処理効率を上げることができます。

関連

inserted by FC2 system