LoginSignup
40
39

More than 5 years have passed since last update.

fs.existsはオワコン?

Posted at

ある日、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を使った方が良いようです。知らなかった……

40
39
0

Register as a new user and use Qiita more conveniently

  1. You get articles that match your needs
  2. You can efficiently read back useful information
  3. You can use dark theme
What you can do with signing up
40
39