情報アイランド

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

Node.jsでファイルの名前を変更したり、移動したりする

ファイルやフォルダの名前を変更したり、移動したりするには非同期的に変更したり、移動したりする方法と同期的に変更したり、移動したりする方法の2つがあります。

非同期的な変更や移動

ファイルやフォルダの名前を非同期的に変更したり、非同期的に移動したりするには、すなわち、ファイルやフォルダのパスを非同期的に変更するにはfs.rename関数を使用します。

var fs = require('fs');

fs.rename('xxx', 'yyy', function (err) {
});

第1引数にファイルやフォルダの変更前のパスを指定します。

第2引数にファイルやフォルダの変更後のパスを指定します。

第3引数にコールバック関数を指定します。この関数の第1引数はエラーオブジェクトです。

同期的な変更や移動

ファイルやフォルダの名前を同期的に変更したり、同期的に移動したりするには、すなわち、ファイルやフォルダのパスを同期的に変更するにはfs.renameSync関数を使用します。

fs.renameSync('xxx', 'yyy');

第1引数にファイルやフォルダの変更前のパスを指定します。

第2引数にファイルやフォルダの変更後のパスを指定します。

使い分け

原則的にはfs.rename関数を使用するべきであり、特に理由がないならfs.renameSync関数は使用するべきではありません。

これは、ファイルやフォルダへのアクセスは非常に時間の掛かる処理であるためです。ファイルやフォルダへのアクセスを同期的に行うとアクセスが完了するまでプログラムは待機状態となり、他の処理を行うことができません。長い時間プログラムが待機状態になると様々な問題を引き起こす可能性があります(このような現象をスターベーションと言います)。

サンプルコード1

fs.rename関数の使用例です。

3つ目のコマンドライン引数として与えられたファイルやフォルダのパスを4つ目のコマンドライン引数として与えられたパスに変更します。

fs-rename.js

var fs = require('fs');

if (process.argv.length < 3) {
    console.error('lack argument.');
    process.exit(1);
}

fs.rename(process.argv[2], process.argv[3], function (err) {
    if (err) {
        console.error(err);
        process.exit(1);
    }
    else {
        console.log('finished!!');
    }
});

実行結果

現在のフォルダにはtextfile.txtという名称のファイルが存在しています。

C:\work\node>type textfile.txt
test

textfile.txtを3つ目のコマンドライン引数に指定し、renamedtextfile.txtを4つ目のコマンドライン引数に指定してコードを実行するとファイルの名前が変更されます。

C:\work\node>node fs-rename.js textfile.txt renamedtextfile.txt
finished!!

C:\work\node>type renamedtextfile.txt
test

現在のフォルダにはfolderという名称のフォルダが存在しています。

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

 Directory of C:\work\node\folder

2016/10/27  20:13    <DIR>          .
2016/10/27  20:13    <DIR>          ..
               0 File(s)              0 bytes
               2 Dir(s)  30,662,320,128 bytes free

renamedtextfile.txtを3つ目のコマンドライン引数に指定し、folder\movedtextfile.txtを4つ目のコマンドライン引数に指定してコードを実行するとファイルが移動されます。

C:\work\node>node fs-rename.js renamedtextfile.txt folder\movedtextfile.txt
finished!!

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

 Directory of C:\work\node\folder

2016/10/27  20:15    <DIR>          .
2016/10/27  20:15    <DIR>          ..
2001/01/01  00:00                 4 movedtextfile.txt
               1 File(s)              4 bytes
               2 Dir(s)  30,662,316,032 bytes free

C:\work\node>type folder\movedtextfile.txt
test

folderを3つ目のコマンドライン引数に指定し、renamedfolderを4つ目のコマンドライン引数に指定してコードを実行するとフォルダの名前が変更されます。

C:\work\node>node fs-rename.js folder renamedfolder
finished!!

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

 Directory of C:\work\node\renamedfolder

2016/10/27  20:15    <DIR>          .
2016/10/27  20:15    <DIR>          ..
2001/01/01  00:00                 4 movedtextfile.txt
               1 File(s)              4 bytes
               2 Dir(s)  30,662,316,032 bytes free

C:\work\node>type renamedfolder\movedtextfile.txt
test

現在のフォルダにはfolder2という名称のフォルダが存在しています。

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

 Directory of C:\work\node\folder2

2016/11/15  15:06    <DIR>          .
2016/11/15  15:06    <DIR>          ..
               0 File(s)              0 bytes
               2 Dir(s)  24,076,451,840 bytes free

renamedfolderを3つ目のコマンドライン引数に指定し、folder2\movedfolderを4つ目のコマンドライン引数に指定してコードを実行するとフォルダが移動されます。

C:\work\node>node fs-rename.js renamedfolder folder2\movedfolder
finished!!

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

 Directory of C:\work\node\folder2

2016/11/15  15:10    <DIR>          .
2016/11/15  15:10    <DIR>          ..
2016/11/15  15:04    <DIR>          movedfolder
               0 File(s)              0 bytes
               3 Dir(s)  24,076,451,840 bytes free

関連

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

-Node.js