ある日、node.js ver.0.10のドキュメントを読んでいたのですが。
http://nodejs.jp/nodejs.org_ja/docs/v0.10/api/fs.html#fs_fs_exists_path_callback より
quote
fs.exists() は時代錯誤で、存在する理由は歴史的経緯だけです。 あなたのコードでこれを使うべき理由があってはいけません。
とりわけ、ファイルをオープンする前に存在をチェックするのは、 あなたのコードを競合条件に対して脆弱にするアンチパターンです: fs.exists() と fs.open() の間に別のプロセスがファイルを 削除するかもしれません。 単純にファイルをオープンして、それが存在しない時はエラーを処理してください。
いつの間にかfs.exists
は使うべきでない、と追記されていました。
自身のコードでも結構使ってたような……というわけで自身で書いたコードでfs.exists
を使用している箇所を修正したのでした。
fs.exists(filepath, function(exists) {
if (exists) {
// 存在した場合
} else {
// 存在していない場合
}
});
fs.open(filepath, 'ax+', 384 /*=0600*/, function(err, fd) {
if (err) {
// 存在していない場合
// 行いたい処理によって
// (err.code === 'EEXISTS') && ...
// など、エラー内容を見ると良いかも
}
// 存在した場合
fd && fs.close(fd, function(err) {
});
});
大体こんな感じになるでしょうか。
ちなみに、err.errno
は非推奨のプロパティで、err.code
を使った方が良いようです。知らなかった……