212

私はすでにNode.jsのドキュメントを読んでおり、何かを見逃していない限り、特定の操作、特にfs.mkdir(). ドキュメントでわかるように、それほど多くはありません。

現在、フォルダーを作成するか、代わりに既存のフォルダーを使用しようとする次のコードがあります。

fs.mkdir(path,function(e){
    if(!e || (e && e.code === 'EEXIST')){
        //do something with contents
    } else {
        //debug
        console.log(e);
    }
});

しかし、これは正しい方法なのだろうか?EEXISTフォルダーが既に存在することを確認する正しい方法は、コードをチェックすることですか? ディレクトリを作成する前にできることはわかってfs.stat()いますが、それはすでにファイルシステムへの 2 つのヒットになります。

第二に、どのエラーオブジェクトが含まれているか、どのパラメータが意味するかなどの詳細を含むNode.jsの完全な、または少なくともより詳細なドキュメントがありますか.

4

14 に答える 14

244

これを行う良い方法は、mkdirpモジュールを使用することです。

$ npm install mkdirp

ディレクトリを必要とする機能を実行するために使用します。パスが作成された後、またはパスが既に存在する場合、コールバックが呼び出されます。errmkdirp がディレクトリ パスの作成に失敗した場合、エラーが設定されます。

var mkdirp = require('mkdirp');
mkdirp('/tmp/some/path/foo', function(err) { 

    // path exists unless there was an error

});
于 2012-12-04T05:58:59.140 に答える
27

の node.js ドキュメントは、fs.mkdir基本的に の Linux man ページに従いますmkdir(2)。これはEEXIST、パスが存在するが、このルートに進むと厄介なコーナーケースを作成するディレクトリではない場合にも示されることを示しています。

fs.statパスが存在するかどうか、およびパスがディレクトリであるかどうかを 1 回の呼び出しで通知する呼び出しを行ったほうがよい場合があります。(私が想定しているのは)ディレクトリがすでに存在する通常の場合、それは単一のファイルシステムヒットのみです。

これらのfsモジュール メソッドは、ネイティブ C API のシン ラッパーであるため、詳細については、node.js ドキュメントで参照されているマニュアル ページを確認する必要があります。

于 2012-12-04T05:45:09.067 に答える
25

これを使用できます:

if(!fs.existsSync("directory")){
    fs.mkdirSync("directory", 0766, function(err){
        if(err){
            console.log(err);
            // echo the result back
            response.send("ERROR! Can't make the directory! \n");
        }
    });
}
于 2014-03-02T15:11:19.533 に答える
4

fs-extraを使用することもできます。これは、頻繁に使用される多くのファイル操作を提供します。

サンプルコード:

var fs = require('fs-extra')

fs.mkdirs('/tmp/some/long/path/that/prob/doesnt/exist', function (err) {
  if (err) return console.error(err)
  console.log("success!")
})

fs.mkdirsSync('/tmp/another/path')

ドキュメントはこちら: https://github.com/jprichardson/node-fs-extra#mkdirsdir-callback

于 2016-09-30T10:24:55.387 に答える
3

私の意見では、Javascriptでコーディングしている間は、ファイルシステムのヒット数を数えない方がよいでしょう。ただし、(1)statmkdirと(2)mkdirおよびエラーコードをチェック(または破棄)することは、どちらの方法もあなたが望むことを行う正しい方法です。

于 2012-12-04T04:39:42.413 に答える
2

ユーザーごとに動的な名前のディレクトリを作成します...このコードを使用します

***suppose email contain user mail address***

var filessystem = require('fs');
var dir = './public/uploads/'+email;

if (!filessystem.existsSync(dir)){
  filessystem.mkdirSync(dir);

}else
{
    console.log("Directory already exist");
}
于 2016-10-31T13:00:33.470 に答える
1

非常にシンプルで読みやすいTeemu Ikonen's answer の新しい代替手段は、パッケージのensureDirメソッドを使用することです。fs-extra

組み込みモジュールの露骨な代替品として使用できるだけでなく、パッケージfsの機能に加えて他の多くの機能も備えています。fs

このensureDirメソッドは、名前が示すように、ディレクトリが存在することを確認します。ディレクトリ構造が存在しない場合は、作成されます。のようにmkdir -p。終了フォルダーだけでなく、パスがまだ存在しない場合はパス全体が作成されます。

上記のものはそのasyncバージョンです。メソッドの形式でこれを実行する同期メソッドもありますensureDirSync

于 2019-05-31T12:21:36.217 に答える
0

ファイル システム モジュールを使用すると、これらすべてを実行できます。

const
  fs = require('fs'),
  dirPath = `path/to/dir`

// Check if directory exists.
fs.access(dirPath, fs.constants.F_OK, (err)=>{
  if (err){
    // Create directory if directory does not exist.
    fs.mkdir(dirPath, {recursive:true}, (err)=>{
      if (err) console.log(`Error creating directory: ${err}`)
      else console.log('Directory created successfully.')
    })
  }
  // Directory now exists.
})

ディレクトリが存在するかどうかを確認する必要さえありません。次のコードは、ディレクトリが既に存在するか作成されていることも保証します。

const
  fs = require('fs'),
  dirPath = `path/to/dir`

// Create directory if directory does not exist.
fs.mkdir(dirPath, {recursive:true}, (err)=>{
  if (err) console.log(`Error creating directory: ${err}`)
  // Directory now exists.
})
于 2019-10-05T06:49:33.483 に答える
0

上記の@Liberateurの答えはうまくいきませんでした(Node v8.10.0)。少し変更してうまくいきましたが、これが正しい方法かどうかはわかりません。提案してください。

// Get modules node
const fs   = require('fs');
const path = require('path');

// Create
function mkdirpath(dirPath)
{
    try {
        fs.accessSync(dirPath, fs.constants.R_OK | fs.constants.W_OK);
    }
    catch(err) {
        try
        {
            fs.mkdirSync(dirPath);
        }
        catch(e)
        {
            mkdirpath(path.dirname(dirPath));
            mkdirpath(dirPath);
        }
    }
}

// Create folder path
mkdirpath('my/new/folder/create');
于 2020-05-31T07:34:16.987 に答える