Javascript Node.js创建文件夹或使用现有文件夹

Javascript Node.js创建文件夹或使用现有文件夹,javascript,node.js,Javascript,Node.js,我已经阅读了Node.js的文档,除非我遗漏了什么,否则它不会告诉特定操作中的参数,特别是。正如您在文档中所看到的,它不是很多 目前,我有以下代码,尝试创建文件夹或使用现有文件夹: fs.mkdir(path,function(e){ if(!e || (e && e.code === 'EEXIST')){ //do something with contents } else { //debug console.

我已经阅读了Node.js的文档,除非我遗漏了什么,否则它不会告诉特定操作中的参数,特别是。正如您在文档中所看到的,它不是很多

目前,我有以下代码,尝试创建文件夹或使用现有文件夹:

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是否有一个完整的或至少更详细的文档,其中包含关于错误对象包含的内容、参数表示的内容等的详细信息。

我认为,在使用Javascript编写代码时,最好不要计算文件系统的点击次数。
但是,(1)
stat
&
mkdir
和(2)
mkdir
并检查(或丢弃)错误代码,这两种方法都是正确的方法来完成您想要的操作。
fs.mkdir
的node.js文档基本上遵从Linux手册页。这表明,如果路径存在,但不是一个目录,如果你走这条路线,它会造成一个尴尬的角落,那么也会指示
EEXIST

您最好打电话告诉您路径是否存在,以及它是否是单个调用中的目录。对于(我假设的是)目录已经存在的正常情况,它只是一个文件系统命中


这些
fs
模块方法是本机C API的精简包装,因此您必须查看node.js文档中引用的手册页以了解详细信息。

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

使用它来运行需要该目录的函数。在创建路径后或路径已存在时调用回调。如果mkdirp无法创建目录路径,则会设置错误
err

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

    // path exists unless there was an error

});
您可以使用以下选项:

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");
编辑:因为这个答案非常流行,所以我对它进行了更新,以反映最新的实践

节点>=10 节点的
fs
的新
{recursive:true}
选项现在允许本机执行此操作。此选项模仿UNIX的
mkdir-p
的行为。它将递归地确保路径的每一部分都存在,如果其中任何一部分存在,它将不会抛出错误

(注意:它仍然可能抛出错误,例如
EPERM
EACCESS
,因此如果您的实现容易受到影响,最好还是将其包装在
try{}catch(e){}
中。)

同步版本

fs.mkdirSync(dirpath,{recursive:true})
异步版本

wait fs.promises.mkdir(dirpath,{recursive:true})
较旧的节点版本 使用
try{}catch(err){}
可以非常优雅地实现这一点,而不会遇到竞争条件

为了避免检查是否存在和创建目录之间的死区时间,我们只需尝试直接创建它,如果它是
EEXIST
(目录已经存在),则忽略错误

但是,如果错误不是
EEXIST
,我们应该抛出一个错误,因为我们可能要处理
EPERM
EACCES

函数ensureDirSync(dirpath){
试一试{
返回fs.mkdirSync(dirpath)
}捕捉(错误){
如果(err.code!=='EEXIST')抛出错误
}
}

对于类似于递归行为的
mkdir-p
,例如
/a/b/c
,您必须在dirpath的每个部分调用它,例如
/a
/a/b
.a/b,如果您想要一个快速而脏的单行程序,请使用以下命令:

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");
您还可以使用,它提供了很多常用的文件操作

示例代码:

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')
此处的文档:

为每个用户创建动态名称目录。。。使用此代码


以下是我用来创建目录(当它不存在时)的ES6代码:

注意:

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

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

// Create folder path
mkdirpath('my/new/folder/create');
  • createDirectory
    函数的开头,我规范化了路径,以确保操作系统的路径分隔符类型将得到一致的使用(例如,这将
    C:\directory/test
    转换为
    C:\directory\test
    (在Windows上时)
  • fs.exists
    是,这就是为什么我使用
    fs.stat
    检查目录是否已经存在
  • 如果目录不存在,错误代码将是
    enoint
    EerrorNO-ENTry)
  • 目录本身将使用
    fs.mkdir
  • 我更喜欢异步函数
    fs.mkdir
    而不是它的阻塞对应函数
    fs.mkdirSync
    ,并且由于包装
    Promise
    可以保证只有在成功创建目录后才会返回目录的路径

我提出了一个没有模块的解决方案(对于可维护性,尤其是对于可以用几行代码编写的小功能,不建议使用累积模块…):

上次更新:

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

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

// Create folder path
mkdirpath('my/new/folder/create');
在v10.12.0中,NodeJS实现递归选项:

// Create recursive folder
fs.mkdir('my/new/folder/create', { recursive: true }, (err) => { if (err) throw err; });
更新:

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

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

// Create folder path
mkdirpath('my/new/folder/create');
但是使用了-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

正如一种更新的替代方法(非常简单且易于阅读)是使用包的方法

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

顾名思义,
ensureDir
方法确保目录存在。如果目录结构不存在,则创建它。如
mkdir-p
。不仅是结束文件夹,如果还不存在,则创建整个路径

上面提供的是
asyncconst
  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.
})
// 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');