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

2020/10/19 05:41 · javascript ·  · 0评论

我已经阅读了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的完整或至少更详细的文档,其中包含有关错误对象包含的内容,参数表示的内容等的详细信息。

做到这一点的好方法是使用mkdirp模块。

$ npm install mkdirp

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

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

    // path exists unless there was an error

});

编辑: 因为这个答案很受欢迎,所以我对其进行了更新以反映最新的做法。

节点> = 10

现在{ recursive: true },Node's的新选项fs本身就允许这样做。此选项模仿UNIX的行为mkdir -p它将以递归方式确保路径的每个部分都存在,并且如果有任何一部分都不会抛出错误。

(注意:它可能仍会引发诸如EPERM或的错误EACCESS,因此,try {} catch (e) {}如果您的实现容易受到影响,最好将其包装在中。)

同步版本。

fs.mkdirSync(dirpath, { recursive: true })

异步版本

await fs.promises.mkdir(dirpath, { recursive: true })

较旧的节点版本

使用try {} catch (err) {},您可以非常优雅地实现此目标,而不会遇到竞争状况。

为了防止在检查存在和创建目录之间出现停滞时间,我们只是简单地尝试直接创建它,而忽略该错误(如果EEXIST目录已经存在)。

EEXIST但是,如果错误不是,则应该引发错误,因为我们可能会处理诸如EPERM或的问题。EACCES

function ensureDirSync (dirpath) {
  try {
    return fs.mkdirSync(dirpath)
  } catch (err) {
    if (err.code !== 'EEXIST') throw err
  }
}

对于mkdir -p样递归的行为,例如./a/b/c,你必须把它在dirpath的每一个部分,例如./a./a/b.a/b/c

如果您想要一种快速又脏的衬板,请使用此:

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

的node.js文档fs.mkdir基本上遵循的Linux手册页mkdir(2)这表示EEXIST如果存在该路径,但也不会显示该目录,如果您走这条路线,该目录不会创建一个笨拙的大写案例。

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

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

您可以使用此:

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

我提出了一种不带模块的解决方案(从不建议使用累积模块来提高可维护性,尤其是对于可以用几行编写的小功能...):

最后更新 :

在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');

您还可以使用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

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

const fs = require('fs');
const path = require('path');

function createDirectory(directoryPath) {
  const directory = path.normalize(directoryPath);

  return new Promise((resolve, reject) => {
    fs.stat(directory, (error) => {
      if (error) {
        if (error.code === 'ENOENT') {
          fs.mkdir(directory, (error) => {
            if (error) {
              reject(error);
            } else {
              resolve(directory);
            }
          });
        } else {
          reject(error);
        }
      } else {
        resolve(directory);
      }
    });
  });
}

const directoryPath = `${__dirname}/test`;

createDirectory(directoryPath).then((path) => {
  console.log(`Successfully created directory: '${path}'`);
}).catch((error) => {
  console.log(`Problem creating directory: ${error.message}`)
});

注意:

  • createDirectory函数开始时,我对路径进行规范化以确保操作系统的路径分隔符类型将被一致使用(例如,在Windows上,它将C:\directory/test变成C:\directory\test()。
  • fs.exists弃用,这就是为什么我fs.stat用来检查目录是否已经存在的原因
  • 如果目录不存在,则错误代码为ENOENTE rror NO ent ry)
  • 目录本身将使用创建 fs.mkdir
  • 我更喜欢异步函数fs.mkdir而不是阻塞函数fs.mkdirSync,因为Promise具有环绕功能,因此可以确保仅在成功创建目录后才返回目录路径

我认为,使用Javascript编码时,最好不要计算文件系统的命中率。但是,(1)statmkdir(2)mkdir和支票(或丢弃)错误代码,这两种方式都是你想要做什么正确的方法。

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

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

就像Teemu Ikonen的答案的一种较新的替代方法一样,它非常简单且易于阅读,它就是使用软件包ensureDir方法fs-extra

它不仅可以用作内置fs模块的公然替代品,而且除了fs包装的功能外,还具有许多其他功能

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

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

您可以使用“文件系统”模块来完成所有这些操作。

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.
})

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

上面的@Liberateur答案对我不起作用(节点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');
本文地址:http://javascript.askforanswer.com/node-jschuangjianwenjianjiahuoshiyongxianyouwenjianjia.html
文章标签: ,  
版权声明:本文为原创文章,版权归 javascript 所有,欢迎分享本文,转载请保留出处!

文件下载

老薛主机终身7折优惠码boke112

上一篇:
下一篇:

评论已关闭!