writeFile no such file or directory

85,304

Solution 1

This is probably because you are trying to write to root of file system instead of your app directory '/avatar/myFile.png' -> __dirname + '/avatar/myFile.png' should do the trick, also check if folder exists. node.js won't create parent folder for you.

Solution 2

Many of us are getting this error because parent path does not exist. E.g. you have /tmp directory available but there is no folder "foo" and you are writing to /tmp/foo/bar.txt.

To solve this, you can use mkdirp - adapted from How to write file if parent folder doesn't exist?

Option A) Using Callbacks

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);
  });
}

Option B) Using Async/Await

Or if you have an environment where you can use async/await:

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

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

Solution 3

I solved a similar problem where I was trying to create a file with a name that contained characters that are not allowed. Watch out for that as well because it gives the same error message.

Solution 4

I ran into this error when creating some nested folders asynchronously right before creating the files. The destination folders wouldn't always be created before promises to write the files started. I solved this by using mkdirSync instead of 'mkdir' in order to create the folders synchronously.

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;
});

Solution 5

Actually, the error message for the file names that are not allowed in Linux/ Unix system comes up with the same error which is extremely confusing. Please check the file name if it has any of the reserved characters. These are the reserved /, >, <, |, :, & characters for Linux / Unix system. For a good read follow this link.

Share:
85,304
basickarl
Author by

basickarl

Hello.

Updated on July 22, 2022

Comments

  • basickarl
    basickarl almost 2 years

    I have a file(data.file an image), I would like to save this image. Now an image with the same name could exist before it. I would like to overwrite if so or create it if it does not exist since before. I read that the flag "w" should do this.

    Code:

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

    Error:

    [Error: ENOENT: no such file or directory, open '/avatar/myFile.png']
    errno: -2,
      code: 'ENOENT',
        syscall: 'open',
          path: '/avatar/myFile.png'
    
  • basickarl
    basickarl over 8 years
    Knew it was something trivial, ta.
  • C. Louis S.
    C. Louis S. about 8 years
    The issue I was having was the parent directory didn't exist. Thanks for the tip
  • Vasanth
    Vasanth over 6 years
    how to write the file in different machine in node js. I am tried with path instead of url(example.com/files) but its given the same error. Is possible to upload the file in different server?
  • SergeS
    SergeS over 6 years
    To do so you need to use proper package to upload via SFTP / FTP / whatever. Or you need to have other server linked (So it is accessible via file system, on windows it should have disk letters assigned, on linux mounted)
  • eestein
    eestein over 5 years
    Question, why await writeFileSync?
  • Lukas Liesis
    Lukas Liesis over 5 years
    @eestein good point, no need. Updated. But there is no difference in this case while fs.writeFileSync is just converted to the resolved promise which does nothing in this context. developer.mozilla.org/en-US/docs/Web/JavaScript/Reference/…
  • DShultz
    DShultz about 5 years
    This resolved my issue on Windows10 as well - Trying to write a file using Date.toIsoString() in the filename contained colons. Replacing the colons fixed the error.
  • Fdebijl
    Fdebijl about 4 years
    mkdirp has been made redundant by the addition of a recursive option for fs.mkDir. Docs.
  • ThisGuyCantEven
    ThisGuyCantEven about 4 years
    This is solution and the answer below are very closely related
  • Troy Gizzi
    Troy Gizzi over 2 years
    Thanks for this! That's exactly why I was getting it.