writeFile没有这样的文件或目录

Kar*_*son 33 fs node.js

我有一个文件(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!");
            });
Run Code Online (Sandbox Code Playgroud)

错误:

{ [Error: ENOENT: no such file or directory, open '/avatar/myFile.png']
  errno: -2,
  code: 'ENOENT',
  syscall: 'open',
  path: '/avatar/myFile.png' }
Run Code Online (Sandbox Code Playgroud)

Ser*_*geS 72

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

  • 我遇到的问题是父目录不存在.谢谢你的提示 (15认同)

Luk*_*kas 11

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

要解决此问题,您可以使用:

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);
  });
}
Run Code Online (Sandbox Code Playgroud)

来源和完整讨论:https://stackoverflow.com/a/16317628/1737158

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

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

const writeFile = async (path, content) => {
  await mkdirp(path);
  fs.writeFileSync(path, content);
}
Run Code Online (Sandbox Code Playgroud)

  • 通过为“fs.mkDir”添加“recursive”选项,“mkdirp”变得多余。[文档](https://nodejs.org/api/fs.html#fs_fs_mkdir_path_options_callback)。 (3认同)

小智 10

在创建文件之前异步创建一些嵌套文件夹时,我遇到了这个错误。在承诺开始写入文件之前,并不总是会创建目标文件夹。我通过使用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;
});
Run Code Online (Sandbox Code Playgroud)


Mas*_*hur 7

实际上,Linux/Unix 系统中不允许的文件名的错误消息也出现了相同的错误,非常令人困惑。请检查文件名是否有任何保留字符。这些是Linux / Unix 系统的保留/、>、<、|、:、&字符。要阅读此链接,请点击此处

  • 这也解决了我在 Windows10 上的问题 - 尝试在包含冒号的文件名中使用 Date.toIsoString() 编写文件。替换冒号修复了错误。 (2认同)

Abh*_*yay 7

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

   if (!fs.existsSync('/avatar')) {
      fs.mkdirSync('/avatar', { recursive: true});
    }
Run Code Online (Sandbox Code Playgroud)


小智 6

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