ファイルの更新日時やアクセス日時を変更する
ファイルの更新日時やアクセス日時を変更するには非同期的に変更する方法と同期的に変更する方法の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
関連
