情報アイランド

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

ファイルの更新日時やアクセス日時を変更する

ファイルの更新日時やアクセス日時を変更するには非同期的に変更する方法と同期的に変更する方法の2つがあります。

非同期的な変更

ファイルの更新日時やアクセス日時を非同期的に変更するにはfs.utimes関数を使用します。

var fs = require('fs');

fs.utimes('xxx', 12345678, 12345678, function (err) {
});

第1引数にファイルのパスを指定します。

第2引数にアクセス日時をUNIX時間として指定します。

第3引数に更新日時をUNIX時間として指定します。

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

同期的な変更

ファイルの更新日時やアクセス日時を同期的に変更するにはfs.utimesSync関数を使用します。

fs.utimesSync('xxx', 12345678, 12345678);

第1引数にファイルのパスを指定します。

第2引数にアクセス日時をUNIX時間として指定します。

第3引数に更新日時をUNIX時間として指定します。

使い分け

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

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

サンプルコード1

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

3つ目のコマンドライン引数として与えられたファイルのアクセス日時を2000年1月1日0時0分に変更し、更新日時を2001年1月1日0時0分に変更します。

fs-utimes.js

var fs = require('fs');

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

fs.utimes(process.argv[2], new Date(2000, 0, 1), new Date(2001, 0, 1), function (err) {
    if (err) {
        console.error(err);
        process.exit(1);
    }
    else {
        console.log('finished!!');
    }
});

実行結果

現在のフォルダにはtextfile.txtという名称のファイルが存在し、アクセス日時は2016年10月24日9時15分となっており、更新日時は2016年10月24日9時18分となっています。

C:\work\node>dir /ta textfile.txt
 Volume in drive C is TI31035600A
 Volume Serial Number is 1CBD-3C48

 Directory of C:\work\node

2016/10/24  09:15                 4 textfile.txt
               1 File(s)              4 bytes
               0 Dir(s)  30,825,971,712 bytes free

C:\work\node>dir /tw textfile.txt
 Volume in drive C is TI31035600A
 Volume Serial Number is 1CBD-3C48

 Directory of C:\work\node

2016/10/24  09:18                 4 textfile.txt
               1 File(s)              4 bytes
               0 Dir(s)  30,825,934,848 bytes free

textfile.txtを3つ目のコマンドライン引数に指定してコードを実行するとファイルのアクセス日時と更新日時が変更されます。

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

C:\work\node>dir /ta textfile.txt
 Volume in drive C is TI31035600A
 Volume Serial Number is 1CBD-3C48

 Directory of C:\work\node

2000/01/01  00:00                 4 textfile.txt
               1 File(s)              4 bytes
               0 Dir(s)  30,825,672,704 bytes free

C:\work\node>dir /tw textfile.txt
 Volume in drive C is TI31035600A
 Volume Serial Number is 1CBD-3C48

 Directory of C:\work\node

2001/01/01  00:00                 4 textfile.txt
               1 File(s)              4 bytes
               0 Dir(s)  30,825,672,704 bytes free

関連

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

-Node.js