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) stat
& mkdir
和(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()); }