情報アイランド

「情報を制する者は世界を制す」をモットーに様々な情報を提供することを目指すブログです。現在はプログラミング関連情報が多めですが、投資関連情報も取り扱っていきたいです。

Node.jsでフォルダを再帰的に変換する

フォルダを再帰的に変換するにはncpモジュールのncp.ncp関数を使用します。

var ncp = require('ncp');

ncp.ncp('xxx', 'yyy', {
    clobber: true, 
    dereference: false, 
    filter: function (element) {
        return true;
        //or
        return false;
    }, 
    transform: function (readable, writable) {
        readable.pipe(writable);
    }, 
    stopOnErr: false, 
    errs: writable
}, function (err) {
});

第1引数に変換元のフォルダのパスを指定します。

第2引数に変換先のフォルダのパスを指定します。

第3引数にオプションをオブジェクトとして指定します。

transformオプションにファイルのデータを変換する処理を関数として指定します。

この関数の第1引数は変換元のファイルのデータを読み込む読み込みストリームであり、第2引数は変換先のファイルにデータを書き込む書き込みストリームです。

この関数では第1引数の読み込みストリームからデータを読み込み、変換し、第2引数の書き込みストリームに書き込むようにします。

なお、基本的なオプションに関しては下の記事を参照してください。

サンプルコード1

3つ目のコマンドライン引数として与えられたフォルダを4つ目のコマンドライン引数として与えられたフォルダに非同期的に再帰的に変換します。

変換先のファイルのデータは変換元のファイルのデータの文字を二重化したものとします。

なお、ストリームの処理のためにmapStream関数とpump関数を使用しています。

ncp-transform.js

var mapStream = require('map-stream');
var pump = require('pump');
var ncp = require('ncp');

ncp.ncp(process.argv[2], process.argv[3], {
    transform: function (readable, writable) {
        readable.setEncoding('utf-8');
        pump(readable, mapStream(function (data, callback) {
            var str = '';
            for (var i = 0; i < data.length; i++) {
                str += data[i];
                str += data[i];
            }
            callback(null, str);
        }), writable, function (err) {
            if (err) {
                console.error(err);
                process.exit(1);
            }
        });
    } 
}, function (err) {
    if (err) {
        console.error(err);
        process.exit(1);
    }
    else {
        console.log('finished!!');
    }
});

使用パッケージ

  • MapStream
    npm install map-streamでインストールします。
  • pump
    npm install pumpでインストールします。
  • ncp
    npm install ncpでインストールします。

実行結果

現在のフォルダにはfolderという名称のフォルダが存在しており、textfile.txtという名称のファイルとfolder2という名称のフォルダを含んでいます。また、folder2フォルダはtextfile2.txtという名称のファイルを含んでいます。

C:\work\node>dir folder
 Volume in drive C is TI31035600A
 Volume Serial Number is 1CBD-3C48

 Directory of C:\work\node\folder

2016/11/19  09:09    <DIR>          .
2016/11/19  09:09    <DIR>          ..
2016/11/19  09:09    <DIR>          folder2
2016/11/19  12:58                12 textfile.txt
               1 File(s)             12 bytes
               3 Dir(s)  26,505,318,400 bytes free

C:\work\node>dir folder\folder2
 Volume in drive C is TI31035600A
 Volume Serial Number is 1CBD-3C48

 Directory of C:\work\node\folder\folder2

2016/11/19  09:09    <DIR>          .
2016/11/19  09:09    <DIR>          ..
2016/11/19  12:58                13 textfile2.txt
               1 File(s)             13 bytes
               2 Dir(s)  26,505,318,400 bytes free

C:\work\node>type folder\textfile.txt
text desu.

C:\work\node>type folder\folder2\textfile2.txt
text2 desu.

folderを3つ目のコマンドライン引数に指定し、folder3を4つ目のコマンドライン引数に指定してコードを実行すると正しくフォルダが再帰的に変換されます。

C:\work\node>node ncp-transform.js folder folder3
finished!!

C:\work\node>dir folder3
 Volume in drive C is TI31035600A
 Volume Serial Number is 1CBD-3C48

 Directory of C:\work\node\folder3

2016/11/19  13:00    <DIR>          .
2016/11/19  13:00    <DIR>          ..
2016/11/19  13:00    <DIR>          folder2
2016/11/19  13:00                24 textfile.txt
               1 File(s)             24 bytes
               3 Dir(s)  26,505,334,784 bytes free

C:\work\node>dir folder3\folder2
 Volume in drive C is TI31035600A
 Volume Serial Number is 1CBD-3C48

 Directory of C:\work\node\folder3\folder2

2016/11/19  13:00    <DIR>          .
2016/11/19  13:00    <DIR>          ..
2016/11/19  13:00                26 textfile2.txt
               1 File(s)             26 bytes
               2 Dir(s)  26,505,334,784 bytes free

C:\work\node>type folder3\textfile.txt
tteexxtt  ddeessuu..


C:\work\node>type folder3\folder2\textfile2.txt
tteexxtt22  ddeessuu..

関連

pizyumi
プログラミング歴19年のベテランプログラマー。業務システム全般何でも作れます。現在はWeb系の技術を勉強中。
スポンサーリンク

-Node.js