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

我已经阅读了Node.js的文档,除非我错过了一些东西,它并不能告诉我们在某些操作中包含什么参数,特别是fs.mkdir() 。 正如你在文档中看到的,这不是很多。

目前,我有这个代码,它试图创build一个文件夹或使用现有的代替:

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

但是我想知道这是正确的做法吗? 正在检查代码EEXIST正确的方式知道文件夹已经存在? 我知道在创build目录之前我可以执行fs.stat() ,但这已经是文件系统的两个命中了。

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

好的方法是使用mkdirp模块。

 $ npm install mkdirp 

用它来运行需要目录的函数。 在创buildpath之后或者path已经存在时调用callback。 如果mkdirp无法创build目录path,则会设置错误err

 var mkdirp = require('mkdirp'); mkdirp('/tmp/some/path/foo', function(err) { // path exists unless there was an error }); 

使用try {} catch {} ,您可以非常优雅地达到此目的,而不会遇到竞争情况:

容错fs.mkdirSync(dirPath)

 const mkdirSync = function (dirPath) { try { fs.mkdirSync(dirPath) } catch (err) { if (err.code !== 'EEXIST') throw err } } 

注意: dirPath被用作参数而不是path ,比如在Node的fs.mkdirSync的官方文档中使用的,以避免与Node的标准path模块混淆。

说明

Node会尝试创build目录,如果遇到exception,将会抛出exception。 在catch {}子句中,如果错误代码是EEXIST ,就意味着该目录存在,我们继续执行脚本,就像没有任何事情发生一样。 如果错误代码不是EEXIST ,我们应该抛出一个错误,因为我们可能正在处理文件系统exception,如EACCES (权限被拒绝)。

因为在检查存在和创build目录之间没有死亡时间,所以我们避免了竞争条件; 但是这只能在使用同步版本(所以fs.mkdir()不起作用)才是真实的),但破坏性的文件系统操作,如mkdir应该只能同步使用。

编辑:我已经find了一种方法来适应相同的概念asynchronousfs.mkdir ,你可以在这个我的要点find

例子

让我们创build目录./first/second/third./first/second/fourth ,给出:

 const fs = require('fs') const path = require('path') const mkdirSync = function (dirPath) { try { fs.mkdirSync(dirPath) } catch (err) { if (err.code !== 'EEXIST') throw err } } 

线性使用

使用上面的包装function,您可以确保目录存在并以简单的方式创build它们。

 mkdirSync(path.resolve('./first')) mkdirSync(path.resolve('./first/second')) mkdirSync(path.resolve('./first/second/third')) mkdirSync(path.resolve('./first/second')) // To demonstrate fault tolerance mkdirSync(path.resolve('./first/second/fourth')) 

注意:您仍然需要确保目录path的每个部分都存在。 直接调用mkdirSync(path.resolve('./first/second/third'))而不确定存在./first./first/second仍然会抛出exception。

象UNIX的mkdir -p这样的recursion用法

为了避免上述缺陷,可以在容错的mkdirSync()中进一步包含recursion函数,以确保path的每个部分都存在:

 const mkdirpSync = function (dirPath) { const parts = dirPath.split(path.sep) // For every part of our path, call our wrapped mkdirSync() // on the full path until and including that part for (let i = 1; i <= parts.length; i++) { mkdirSync(path.join.apply(null, parts.slice(0, i))) } } // You can now directly create the two target directories mkdirpSync('first/second/third') mkdirpSync('first/second/fourth') 

如果你想要一个快而又脏的衬里,使用这个:

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

fs.mkdir的node.js文档基本上fs.mkdir mkdir(2)的Linux手册页。 这表明,如果path存在, EEXIST也将被指示,但是如果你走这条路线,不是一个创build一个尴尬angular落案例的目录。

你最好调用fs.stat ,它会告诉你path是否存在,以及它是否是一个目录。 对于(我假定是)目录已经存在的正常情况下,它只是一个单一的文件系统命中。

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

在我看来,你最好不要在Javascript中编写文件系统命中。 但是,(1) statmkdir和(2) mkdir并检查(或放弃)错误代码,这两种方法都是正确的方法来做你想做的事情。

你也可以使用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') 

docs here: https : //github.com/jprichardson/node-fs-extra#mkdirsdir-callback

为每个用户创builddynamic名称目录…使用此代码

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

这里是我用来创build一个目录(当它不存在)的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函数开始时,我规范化path以保证操作系统的path分隔符types将被一致地使用(例如,这会将C:\directory/test转换为C:\directory\test (当在Windows )
  • fs.exists已被弃用 ,这就是为什么我使用fs.stat来检查目录是否已经存在
  • 如果目录不存在,则错误代码将为ENOENT (错误
  • 目录本身将使用fs.mkdir创build
  • 我更喜欢通过asynchronous函数fs.mkdir来阻止对应的fs.mkdirSync并且由于包装Promise ,将保证目录的path只有在成功创build目录后才会返回

我build议更简单:

 // Get modules node const fs = require('fs'); const path = require('path'); // Create function mkdirpath(dirPath) { if(!fs.existsSync(dirPath)) { try { fs.mkdirSync(dirPath); } catch(e) { mkdirpath(path.dirname(dirPath)); mkdirpath(dirPath); } } } // Create folder path mkdirpath('my/new/folder/create'); 
 var fs = require('fs'); if (fs.existsSync('temp')) { console.log('Directory exists, removing...'); if (fs.existsSync('temp/new.txt')) { fs.unlinkSync('temp/new.txt'); } fs.rmdirSync('temp'); } fs.mkdirSync('temp'); if (fs.existsSync('temp')) { process.chdir('temp'); fs.writeFileSync('test.txt', 'This is some test text for the file'); fs.renameSync('test.txt','new.txt'); console.log('File has size: ' + fs.statSync('new.txt').size + ' bytes'); console.log('File contents: ' + fs.readFileSync('new.txt').toString()); }