web-dev-qa-db-ja.com

nodejs:fs.stat()またはfs.access()フォルダが存在するかどうかを確認する?

私は現在、ローカルフォルダが存在するかどうかを確認する方法を見つけようとしています。ファイルを保存する前に、nodejsドキュメントによって少し混乱しています。

fs.exists() 廃止予定で、fs.stat()またはfs.access()を使用する必要があります。ここまでは順調ですね。

fs.stat():

Fs.stat()を使用してfs.open()、fs.readfile()またはfs.writefile()を呼び出す前にファイルの存在を確認することはお勧めできません。代わりに、ユーザーコードはファイルを直接開く/読み書きする必要があり、ファイルが使用できない場合に発生したエラーを処理する必要があります。

この状態では、私が書くこと、エラーをキャッチし、フォルダの作成、そしてやり直すべきです。また、ファイルを移動/名前変更している場合でも、私は直接3つの機能のうちの1つを使用しません。

それから、ドックは言う:

その後に操作せずにファイルが存在するかどうかを確認するには、fs.access()をお勧めします。

私は本当にファイルを修正していないので、それはコンテンツの内容のみです。これが行く方法であると主張するかもしれません。

しかし、もう一度、fs.access()のドキュメントはなぜそれが悪い考えでもあります。

Fs.open()、fs.readfile()またはfs.writefile()を呼び出す前のファイルのアクセシビリティをチェックするためにfs.access()を使用することはお勧めできません。その他のプロセスは、2つの呼び出しの間のファイルの状態を変更する可能性があるため、競合状態を紹介します。代わりに、ユーザーコードはファイルを直接開く/読み書きする必要があり、ファイルにアクセスできない場合は発生したエラーを処理する必要があります。

Yadda Yadda Yadda、すでに多少関連の質問があります( ここ 、または ここ )、2歳以下の「ベストプラクティス」に関する公式情報はありますか。 ?

11
BenSower

適切な方法では、ノードがサポートしているとは思わないが、ディレクトリを開くことはDirfdを取得することです。それは開くだけで使われるべきであり、その後、ifcessまたはfdはdirfdまたはfd上で呼び出すことができます。その後、ディレクトリの開いている場合は、dirfdを使ってOpenATを使用してファイルを開きます。

パスがファイルではない場合は、FS.CreateReadStreamを使用し、エラーを処理したHTTPサーバーを書きました。また、ストリームが応答にパイプされる前に、OpenファイルのFSTATを使用できるようにするために、一時停止と再開を使用しました。

0
Dan D.