writeFile 没有那个文件或目录

writeFile no such file or directory

我有一个文件(data.file一张图片),我想保存这张图片。现在,同名图像 可能 存在于它之前。如果是这样,我想覆盖它,如果它以前不存在,我想创建它。我读到标志 "w" 应该这样做。

代码:

fs.writeFile('/avatar/myFile.png', data.file, {
  flag: "w"
}, function(err) {
  if (err) {
    return console.log(err);
  }
  console.log("The file was saved!");
});

错误:

[Error: ENOENT: no such file or directory, open '/avatar/myFile.png']
errno: -2,
  code: 'ENOENT',
    syscall: 'open',
      path: '/avatar/myFile.png'

这可能是因为您正在尝试写入文件系统的根目录而不是您的应用程序目录 '/avatar/myFile.png' -> __dirname + '/avatar/myFile.png' 应该可以解决问题,还要检查文件夹是否存在。 node.js 不会为您创建父文件夹。

我解决了一个类似的问题,我试图创建一个名称包含不允许字符的文件。也要注意这一点,因为它会给出相同的错误消息。

我们中的许多人都收到此错误,因为 父路径 不存在。例如。您有 /tmp 目录可用,但没有文件夹 "foo",您正在写入 /tmp/foo/bar.txt.

要解决这个问题,您可以使用mkdirp - adapted from How to write file if parent folder doesn't exist?

选项 A) 使用回调

const mkdirp = require('mkdirp');
const fs = require('fs');
const getDirName = require('path').dirname;

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

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

选项 B) 使用 Async/Await

或者如果你有可以使用的环境 async/await:

const mkdirp = require('mkdirp');
const fs = require('fs');

const writeFile = async (path, content) => {
  await mkdirp(path);
  fs.writeFileSync(path, content);
}

实际上,对于Linux/ Unix系统中不允许的文件名的错误信息出现了同样的错误,非常令人困惑。请检查文件名是否包含任何保留字符。这些是 /, >, <, |, :, & 为 Linux / Unix 系统保留的字符。为了更好地阅读,请遵循此 link

我 运行 在创建文件之前异步创建一些嵌套文件夹时遇到此错误。在承诺开始写入文件之前,并不总是会创建目标文件夹。为了同步创建文件夹,我使用 mkdirSync 而不是 'mkdir' 解决了这个问题。

try {
    fs.mkdirSync(DestinationFolder, { recursive: true } );
} catch (e) {
    console.log('Cannot create folder ', e);
}
fs.writeFile(path.join(DestinationFolder, fileName), 'File Content Here', (err) => {
    if (err) throw err;
});

有这个错误,因为我试图 运行:

fs.writeFile(file)
fs.unlink(file)
...lots of code... probably not async issue...
fs.writeFile(file)

在同一个脚本中。第二次 writeFile 调用时发生异常。删除前两个调用解决了问题。

您可以使用“./”作为路径前缀。

在你的例子中,你会写:

fs.writeFile('./avatar/myFile.png', data.file, (err) => {
  if (err) {
    return console.log(err);
  }
  console.log("The file was saved!");
});

在我的例子中,我使用异步 fs.mkdir(),然后 没有等待此任务完成 ,我尝试创建一个文件 fs.writeFile()。 ..

它告诉你 avatar 文件夹不存在。 在将文件写入此文件夹之前,您需要检查名为 "avatar" 的目录是否存在,如果不存在,请创建它:

   if (!fs.existsSync('/avatar')) {
      fs.mkdirSync('/avatar', { recursive: true});
    }

一样,使用 / 尝试写入您的系统根文件夹,而不是使用 __dirname,它指向writeFile调用的文件路径,可以使用process.cwd()指向项目目录。示例:

writeFile(`${process.cwd()}/pictures/myFile.png`, data, (err) => {...});

如果您想避免使用字符串 concatenations/interpolations,您也可以使用 path.join(process.cwd(), 'pictures', 'myFile.png')(更多详细信息,包括目录创建,在此 digitalocean article 中)。