我已经阅读了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(),但这已经是两次对文件系统的访问了。

其次,是否有一个完整的或至少更详细的Node.js文档,其中包含错误对象包含什么,参数表示什么等细节。


当前回答

Teemu Ikonen的答案非常简单易读,它的一个更新的替代方法是使用fs-extra包的ensureDir方法。

它不仅可以作为内置fs模块的明显替代品,而且除了fs包的功能之外,它还具有许多其他功能。

顾名思义,ensureDir方法确保目录存在。如果目录结构不存在,则创建目录结构。比如mkdir -p。不只是结束文件夹,而是创建整个路径(如果不存在的话)。

上面提供的是它的异步版本。它还有一个同步方法,以ensureDirSync方法的形式执行此操作。

其他回答

你可以用这个:

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");
        }
    });
}

如果你想要一个快速而脏的眼线笔,使用这个:

fs.existsSync("directory") || fs.mkdirSync("directory");

Teemu Ikonen的答案非常简单易读,它的一个更新的替代方法是使用fs-extra包的ensureDir方法。

它不仅可以作为内置fs模块的明显替代品,而且除了fs包的功能之外,它还具有许多其他功能。

顾名思义,ensureDir方法确保目录存在。如果目录结构不存在,则创建目录结构。比如mkdir -p。不只是结束文件夹,而是创建整个路径(如果不存在的话)。

上面提供的是它的异步版本。它还有一个同步方法,以ensureDirSync方法的形式执行此操作。

Raugaral的回答,但是有-p功能。很丑,但很管用:

function mkdirp(dir) {
    let dirs = dir.split(/\\/).filter(asdf => !asdf.match(/^\s*$/))
    let fullpath = ''

    // Production directory will begin \\, test is on my local drive.
    if (dirs[0].match(/C:/i)) {
        fullpath = dirs[0] + '\\'
    }
    else {
        fullpath = '\\\\' + dirs[0] + '\\'
    }

    // Start from root directory + 1, build out one level at a time.
    dirs.slice(1).map(asdf => {
        fullpath += asdf + '\\'
        if (!fs.existsSync(fullpath)) {
            fs.mkdirSync(fullpath)
        }
    })
}//mkdirp

实现这一点的好方法是使用mkdirp模块。

$ npm install mkdirp

使用它来运行需要该目录的函数。回调函数在路径创建后或路径已经存在时调用。mkdirp创建目录路径失败,设置错误err。

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

    // path exists unless there was an error

});