我已经阅读了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文档,其中包含错误对象包含什么,参数表示什么等细节。
编辑:因为这个答案很流行,我更新了它,以反映最新的实践。
节点> = 10
Node的fs的新{recursive: true}选项现在允许本机执行此操作。该选项模仿UNIX的mkdir -p的行为。它将递归地确保路径的每个部分都存在,如果其中任何一部分存在,也不会抛出错误。
(注意:它仍然可能抛出诸如EPERM或EACCESS之类的错误,所以如果你的实现容易受到它的影响,最好还是将它包装在try {} catch (e){}中。)
同步版本。
fs.mkdirSync(dirpath, { recursive: true })
异步版本
await fs.promises.mkdir(dirpath, { recursive: true })
Node旧版本
使用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
下面是我用来创建目录的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}`)
});
注意:
In the beginning of the createDirectory function, I normalize the path to guarantee that the path seperator type of the operating system will be used consistently (e.g. this will turn C:\directory/test into C:\directory\test (when being on Windows)
fs.exists is deprecated, that's why I use fs.stat to check if the directory already exists
If a directory doesn't exist, the error code will be ENOENT (Error NO ENTry)
The directory itself will be created using fs.mkdir
I prefer the asynchronous function fs.mkdir over it's blocking counterpart fs.mkdirSync and because of the wrapping Promise it will be guaranteed that the path of the directory will only be returned after the directory has been successfully created
我提出了一个没有模块的解决方案(对于可维护性,不建议积累模块,特别是对于可以用几行代码编写的小函数……):
最近更新:
在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');
您可以使用File System模块完成所有这些操作。
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.
})