如果目录不存在,以下是创建目录的正确方法吗?
脚本应该拥有完全权限,并可被其他人阅读。
var dir = __dirname + '/upload';
if (!path.existsSync(dir)) {
fs.mkdirSync(dir, 0744);
}
如果目录不存在,以下是创建目录的正确方法吗?
脚本应该拥有完全权限,并可被其他人阅读。
var dir = __dirname + '/upload';
if (!path.existsSync(dir)) {
fs.mkdirSync(dir, 0744);
}
正如一些答案所指出的那样,自从Node 10版本以后,你可以在mkdir
中使用recursive:true
但是还没有指出的是,当使用recursive:true时,如果目录已经存在,mkdir不会返回错误。
因此,你可以这样做:
fs.mkdir(dirPath,{recursive:true},(err) => {
if(err) {
//note: this does NOT get triggered if the directory already existed
console.warn(err)
}
else{
//directory now exists
}
})
自从 Node 10 版本以后,你可以通过从 fs/promises
引入来获取所有 fs 函数的 Promise 版本。
因此,将这两个要素结合起来,你就得到了这个简单的解决方案:
import * as fs from 'fs/promises';
await fs.mkdir(dirPath, {recursive:true}).catch((err) => {
//decide what you want to do if this failed
console.error(err);
});
//directory now exists
fs.exist()已经被弃用,所以我使用fs.stat()来检查目录状态。如果目录不存在,fs.stat()会抛出一个错误信息,如“没有这个文件或目录”。然后我创建了一个目录。
const fs = require('fs').promises;
const dir = './dir';
fs.stat(dir).catch(async (err) => {
if (err.message.includes('no such file or directory')) {
await fs.mkdir(dir);
}
});
使用:
var filessystem = require('fs');
var dir = './path/subpath/';
if (!filessystem.existsSync(dir))
{
filessystem.mkdirSync(dir);
}
else
{
console.log("Directory already exist");
}
var dir = 'path/to/dir';
try {
fs.mkdirSync(dir);
} catch(e) {
if (e.code != 'EEXIST') throw e;
}
existsSync
已被弃用。 - Ping.Gobluefs.exists()
已被废弃,但 fs.existsSync()
并未被废弃。您能否添加一个链接到标明 fs.existsSync()
被废弃的资源? - francis对于其他在2023年寻找此功能的人,您现在可以使用async/await - try/catch语法轻松实现:
import { stat, mkdir } from 'node:fs/promises';
const checkAndMakeDirectory = async (dir) => {
try {
await stat(dir);
} catch (error) {
if (error.code === "ENOENT") {
try {
await mkdir(dir);
} catch (err) {
console.error(err.message);
}
}
}
}
使用 Node.js 10+ 和 ES6:
import path from 'path';
import fs from 'fs';
(async () => {
const dir = path.join(__dirname, 'upload');
try {
await fs.promises.mkdir(dir);
} catch (error) {
if (error.code === 'EEXIST') {
// Something already exists, but is it a file or directory?
const lstat = await fs.promises.lstat(dir);
if (!lstat.isDirectory()) {
throw error;
}
} else {
throw error;
}
}
})();
// https://en.wikipedia.org/wiki/File_system_permissions#Numeric_notation
const allRWEPermissions = parseInt("0777", 8);
function ensureFilePathExists(path: string, mask: number = allRWEPermissions): Promise<void> {
return new Promise<void>(
function(resolve: (value?: void | PromiseLike<void>) => void,
reject: (reason?: any) => void): void{
mkdir(path, mask, function(err: NodeJS.ErrnoException): void {
if (err) {
if (err.code === "EEXIST") {
resolve(null); // Ignore the error if the folder already exists
} else {
reject(err); // Something else went wrong
}
} else {
resolve(null); // Successfully created folder
}
});
});
}
从文档中可以看到,以下是异步递归执行的方法:
const fs = require('fs');
const fsPromises = fs.promises;
fsPromises.access(dir, fs.constants.F_OK)
.catch(async() => {
await fs.mkdir(dir, { recursive: true }, function(err) {
if (err) {
console.log(err)
}
})
});
你可以使用Node.js的文件系统命令fs.stat来检查目录是否存在,使用带有回调函数的fs.mkdir创建目录或者使用不带回调函数的fs.mkdirSync创建目录,就像这个例子一样:
// First require fs
const fs = require('fs');
// Create directory if not exist (function)
const createDir = (path) => {
// Check if dir exist
fs.stat(path, (err, stats) => {
if (stats.isDirectory()) {
// Do nothing
} else {
// If the given path is not a directory, create a directory
fs.mkdirSync(path);
}
});
};
如果子目录不存在,我需要创建它们。我使用了以下代码:
const path = require('path');
const fs = require('fs');
function ensureDirectoryExists(p) {
//console.log(ensureDirectoryExists.name, {p});
const d = path.dirname(p);
if (d && d !== p) {
ensureDirectoryExists(d);
}
if (!fs.existsSync(d)) {
fs.mkdirSync(d);
}
}
TypeError: path.existsSync is not a function
的错误提示(我正在使用 Node v8.10)。 - Jean Paul