web-dev-qa-db-ja.com

衝突なしでノードにtmpディレクトリを作成する方法

Node.jsにオンデマンドで一時的な「スクラッチ」ディレクトリを作成する必要があります。要件は次のとおりです。

  • dirnameはランダム化する必要があります(つまり、/tmp/aDIge4G/
  • ディレクトリは、/tmp内に作成されます。このディレクトリには、ランダムに名前が付けられた他のディレクトリがすでに存在する場合があります。
  • ディレクトリがすでに存在する場合は、それを使用するのではなくスローして、他の誰かの作業を上書きする必要があります
  • これは、並行環境で安全である必要があります。他の誰かが同じ名前のディレクトリを作成した可能性があるため、ディレクトリが存在するかどうかを確認し、存在しない場合は作成することはできませんafter私はチェックした。

言い換えれば、私は this の質問に対する答えが必要ですが、ファイルではなくディレクトリについてです。

これ 答えは、私がやりたいことはmkdir -pで実行できると言いますが、Nodeには-pfs.mkdirフラグがありません

17
BonsaiOak

package "tmp" を試すことができます。 Linuxの mkstemp 関数を使用する構成パラメーター「テンプレート」があり、おそらくすべての要件を解決します。

12
Pavol Pitonak

現在のノードAPIは一時フォルダーの作成を提案します: https://nodejs.org/api/fs.html#fs_fs_mkdtemp_prefix_options_callback

それは与える:

fs.mkdtemp(path.join(os.tmpdir(), 'foo-'), (err, folder) => {
  if (err) throw err;
  console.log(folder);
  // Prints: /tmp/foo-itXde2
});
// folder /tmp/foo-itXde2 has been created on the file system
9
Hettomei

一意のディレクトリを作成する簡単な方法は、パス名内で universally unique identifiers (UUID)を使用することです。

pure-uuid の使用例を次に示します。

const fs = require('fs-extra');
const path = require('path');
const UUID = require('pure-uuid');

const id = new UUID(4).format();
const directory = path.join('.', 'temp', id);

fs.mkdirs(directory).then(() => {
  console.log(`Created directory: ${directory}`);
});

次のような出力が得られます。

作成されたディレクトリ:temp\165df8b8-18cd-4151-84ca-d763e2301e14

注:上記のコードでは、ドロップイン置換として fs-extra を使用しています fs の場合、mkdir -pがディレクトリと必要なサブディレクトリを作成するため、fs-extraを気にする必要はありません。

ヒント:オペレーティングシステムのデフォルトの一時ディレクトリ内にディレクトリを保存する場合は、 を使用できます。 os.tmpdir() 。これがどのように機能するかの例です:

const fs = require('fs-extra');
const os = require('os');
const path = require('path');
const UUID = require('pure-uuid');

const id = new UUID(4).format();
const directory = path.join(os.tmpdir(), id);

fs.mkdirs(directory).then(() => {
  console.log(`Created directory: ${directory}`);
});

作成されたディレクトリ:C:\ Users\bennyn\AppData\Local\Temp\057a9978-4fd7-43d9-b5ea-db169f222dba

1

fs.Stats を使用して、存在するかどうかを確認しますか?

このようなもの?

fs.stat(path, function(err, stats) {

    if (!stats.isDirectory()) {
        // create directory here
    }
}
0