web-dev-qa-db-ja.com

ファイルがまだ存在しない場合は作成します

ファイルfoobarを作成したいと思います。ただし、ユーザーがすでにfoobarという名前のファイルを持っている場合は、それらのファイルを上書きしたくありません。したがって、foobarがまだ存在しない場合にのみ、作成したいと思います。

最初、私はこれを行うべきだと思いました:

fs.exists(filename, function(exists) {
  if(exists) {
    // Create file
  }
  else {
    console.log("Refusing to overwrite existing", filename);
  }
});

ただし、 公式ドキュメント for fs.exists、それは読みます:

fs.exists()は時代錯誤であり、歴史的な理由でのみ存在します。独自のコードで使用する理由はほとんどありません。

特に、ファイルを開く前にファイルが存在するかどうかを確認することは、競合状態に対して脆弱なアンチパターンです。別のプロセスが、fs.exists()とfs.open()の呼び出しの間にファイルを削除する場合があります。ファイルを開いて、そこにない場合はエラーを処理するだけです。

fs.exists()は非推奨になります。

明らかに、ノード開発者は私の方法は悪い考えだと考えています。また、廃止される機能は使いたくありません。

既存のファイルを上書きせずにファイルを作成するにはどうすればよいですか?

10
Cory Klein

答えは次のとおりです。

ファイルを開いて、そこにない場合はエラーを処理するだけです。

次のようなものを試してください:

function createFile(filename) {
  fs.open(filename,'r',function(err, fd){
    if (err) {
      fs.writeFile(filename, '', function(err) {
          if(err) {
              console.log(err);
          }
          console.log("The file was saved!");
      });
    } else {
      console.log("The file exists!");
    }
  });
}
19
Davide Ungari
fs.closeSync(fs.openSync('/var/log/my.log', 'a'))
6
cstuncsik

後でこのファイルにデータを書き込みたい場合は、fs.appendFile('message.txt', 'data to append', 'utf8', callback);を使用できます。

データをファイルに非同期的に追加し、ファイルがまだ存在しない場合はファイルを作成します。データは文字列またはバッファにすることができます。

ノードファイルシステムのドキュメント

0
Remek Ambroziak