首页
学习
活动
专区
工具
TVP
发布
社区首页 >问答首页 >如果父文件夹不存在,如何写入文件?

如果父文件夹不存在,如何写入文件?
EN

Stack Overflow用户
提问于 2013-05-01 18:17:45
回答 11查看 96.2K关注 0票数 110

我需要将文件写入以下路径:

代码语言:javascript
复制
fs.writeFile('/folder1/folder2/file.txt', 'content', function () {…});

'/folder1/folder2'路径可能不存在。因此,我得到以下错误:

message=ENOENT,打开/folder1/folder2/file.txt

如何将内容写入该路径?

EN

回答 11

Stack Overflow用户

回答已采纳

发布于 2013-05-01 19:52:00

在节点v10中,这是内置于fs.mkdir函数中的,我们可以将该函数与path.dirname结合使用

代码语言:javascript
复制
var fs = require('fs');
var getDirName = require('path').dirname;

function writeFile(path, contents, cb) {
  fs.mkdir(getDirName(path), { recursive: true}, function (err) {
    if (err) return cb(err);

    fs.writeFile(path, contents, cb);
  });
}

对于旧版本,您可以使用mkdirp

代码语言:javascript
复制
var mkdirp = require('mkdirp');
var fs = require('fs');
var getDirName = require('path').dirname;

function writeFile(path, contents, cb) {
  mkdirp(getDirName(path), function (err) {
    if (err) return cb(err);
    
    fs.writeFile(path, contents, cb);
  });
}

如果整个路径已经存在,则mkdirp是noop。否则,它会为您创建所有缺少的目录。

此模块执行您想要的操作:https://npmjs.org/package/writefile。在谷歌上搜索"writefile mkdirp“时得到的。此模块返回promise,而不是接受回调,因此请务必先阅读promise的一些介绍。它实际上可能会让你的事情变得复杂。

我给出的函数在任何情况下都有效。

票数 143
EN

Stack Overflow用户

发布于 2017-02-04 01:13:21

我发现最简单的方法是使用fs-extra模块中的()方法。

与writeFile几乎相同(即覆盖),只是如果父目录不存在,则会创建父目录。选项是您要传递给fs.writeFile()的内容。

示例:

代码语言:javascript
复制
var fs = require('fs-extra');
var file = '/tmp/this/path/does/not/exist/file.txt'

fs.outputFile(file, 'hello!', function (err) {
    console.log(err); // => null

    fs.readFile(file, 'utf8', function (err, data) {
        console.log(data); // => hello!
    });
});

如今,它还承诺提供开箱即用的支持!

票数 32
EN

Stack Overflow用户

发布于 2016-11-19 06:31:14

编辑

NodeJS version 10.12.0添加了对mkdirmkdirSync的本机支持,以使用recursive: true选项递归创建父控制器,如下所示:

代码语言:javascript
复制
fs.mkdirSync(targetDir, { recursive: true });

如果你更喜欢fs Promises API,你可以写

代码语言:javascript
复制
fs.promises.mkdir(targetDir, { recursive: true });

原始答案

如果父目录不存在,则递归地创建它们!(零依赖)

代码语言:javascript
复制
const fs = require('fs');
const path = require('path');

function mkDirByPathSync(targetDir, { isRelativeToScript = false } = {}) {
  const sep = path.sep;
  const initDir = path.isAbsolute(targetDir) ? sep : '';
  const baseDir = isRelativeToScript ? __dirname : '.';

  return targetDir.split(sep).reduce((parentDir, childDir) => {
    const curDir = path.resolve(baseDir, parentDir, childDir);
    try {
      fs.mkdirSync(curDir);
    } catch (err) {
      if (err.code === 'EEXIST') { // curDir already exists!
        return curDir;
      }

      // To avoid `EISDIR` error on Mac and `EACCES`-->`ENOENT` and `EPERM` on Windows.
      if (err.code === 'ENOENT') { // Throw the original parentDir error on curDir `ENOENT` failure.
        throw new Error(`EACCES: permission denied, mkdir '${parentDir}'`);
      }

      const caughtErr = ['EACCES', 'EPERM', 'EISDIR'].indexOf(err.code) > -1;
      if (!caughtErr || caughtErr && curDir === path.resolve(targetDir)) {
        throw err; // Throw if it's just the last created dir.
      }
    }

    return curDir;
  }, initDir);
}

用法

代码语言:javascript
复制
// Default, make directories relative to current working directory.
mkDirByPathSync('path/to/dir');

// Make directories relative to the current script.
mkDirByPathSync('path/to/dir', {isRelativeToScript: true});

// Make directories with an absolute path.
mkDirByPathSync('/path/to/dir');

演示

解释

  • UPDATE此解决方案可处理特定于平台的错误,如适用于Mac和EPERMEISDIR以及适用于Windows.
  • This的EACCES解决方案可同时处理相对绝对路径。
  • 在相对路径的情况下,将在当前工作目录中创建(解析)目标目录。要解决与当前脚本目录相关的问题,请传递{isRelativeToScript: true}.
  • Using path.seppath.resolve(),而不仅仅是/连接,以避免跨平台issues.
  • Using fs.mkdirSync,并在抛出竞争条件时使用try/catch处理错误:另一个进程可能会在对fs.existsSync()fs.mkdirSync()的调用之间添加文件并导致异常。
    • 另一种方法是检查文件是否存在,然后创建它,即if (!fs.existsSync(curDir) fs.mkdirSync(curDir);。但是这是一种反模式,使得代码容易受到竞争conditions.

的攻击。

  • 需要Node v6及更高版本才能支持解构。(如果您在使用旧节点版本实现此解决方案时遇到问题,请给我留言)
票数 31
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/16316330

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档