我试图创建一个完整的路径,如果它不存在。

代码如下所示:

var fs = require('fs');
if (!fs.existsSync(newDest)) fs.mkdirSync(newDest); 

只要只有一个子目录(像'dir1'这样的newDest),这段代码就能很好地工作,但是当有一个目录路径('dir1/dir2')时,它就会失败 错误:ENOENT,没有这样的文件或目录

我希望能够用尽可能少的代码行创建完整的路径。

我读到fs上有一个递归选项,并尝试了这样做

var fs = require('fs');
if (!fs.existsSync(newDest)) fs.mkdirSync(newDest,'0777', true);

我觉得递归地创建一个不存在的目录应该这么简单。我是否遗漏了一些东西,或者我是否需要解析路径并检查每个目录,如果它不存在,则创建它?

我对Node很陌生。也许我使用的是旧版本的FS?


当前回答

下面是我为nodejs编写的mkdirp命令式版本。

function mkdirSyncP(location) {
    let normalizedPath = path.normalize(location);
    let parsedPathObj = path.parse(normalizedPath);
    let curDir = parsedPathObj.root;
    let folders = parsedPathObj.dir.split(path.sep);
    folders.push(parsedPathObj.base);
    for(let part of folders) {
        curDir = path.join(curDir, part);
        if (!fs.existsSync(curDir)) {
            fs.mkdirSync(curDir);
        }
    }
}

其他回答

我对fs的递归选项有问题。mkdir,所以我做了一个函数,做以下工作:

Creates a list of all directories, starting with the final target dir and working up to the root parent. Creates a new list of needed directories for the mkdir function to work Makes each directory needed, including the final function createDirectoryIfNotExistsRecursive(dirname) { return new Promise((resolve, reject) => { const fs = require('fs'); var slash = '/'; // backward slashes for windows if(require('os').platform() === 'win32') { slash = '\\'; } // initialize directories with final directory var directories_backwards = [dirname]; var minimize_dir = dirname; while (minimize_dir = minimize_dir.substring(0, minimize_dir.lastIndexOf(slash))) { directories_backwards.push(minimize_dir); } var directories_needed = []; //stop on first directory found for(const d in directories_backwards) { if(!(fs.existsSync(directories_backwards[d]))) { directories_needed.push(directories_backwards[d]); } else { break; } } //no directories missing if(!directories_needed.length) { return resolve(); } // make all directories in ascending order var directories_forwards = directories_needed.reverse(); for(const d in directories_forwards) { fs.mkdirSync(directories_forwards[d]); } return resolve(); }); }

一种选择是使用shelljs模块

npm install shelljs

var shell = require('shelljs');
shell.mkdir('-p', fullPath);

从那一页开始:

可用的选项: P:全路径(如有必要将创建中间dirs)

正如其他人所注意到的,还有其他更专注的模块。但是,除了mkdirp之外,它还有大量其他有用的shell操作(比如which, grep等等…),并且它可以在windows和*nix上工作

编辑:评论建议这在没有mkdir cli实例的系统上不起作用。事实并非如此。这就是shelljs的重点——创建一个可移植的跨平台shell类函数集。它适用于偶数窗户。

您可以使用下一个函数

const recursiveUpload =(路径:字符串)=> { Const paths = path.split("/")

const fullPath = paths.reduce((accumulator, current) => {
  fs.mkdirSync(accumulator)
  return `${accumulator}/${current}`
  })

  fs.mkdirSync(fullPath)

  return fullPath
}

它的作用是:

创建路径变量,它将每个路径单独存储为数组的一个元素。 在数组中每个元素的末尾添加"/"。 形成循环: 从索引从0到当前迭代的数组元素的连接中创建一个目录。基本上,它是递归的。

希望有帮助!

顺便说一下,在Node v10.12.0中,可以通过将递归路径创建作为附加参数来使用。

fs。mkdir(“/ tmp / /苹果”,{递归:真},(err) = > { 如果(错误)抛出错误; });

https://nodejs.org/api/fs.html#fs_fs_mkdirsync_path_options

现在NodeJS >= 10.12.0,你可以使用fs。mkdirSync(path, {recursive: true}

我知道这是一个老问题,但是nodejs v10.12.0现在通过将递归选项设置为true在本地支持这个选项。fs.mkdir

// Creates /tmp/a/apple, regardless of whether `/tmp` and /tmp/a exist.
fs.mkdir('/tmp/a/apple', { recursive: true }, (err) => {
  if (err) throw err;
});