writeFile no such file or directory
node.jsFsnode.js Problem Overview
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:
> yaml > [Error: ENOENT: no such file or directory, open '/avatar/myFile.png'] > errno: -2, > code: 'ENOENT', > syscall: 'open', > path: '/avatar/myFile.png' >
node.js Solutions
Solution 1 - node.js
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 - node.js
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 - node.js
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 - node.js
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 - node.js
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.
Solution 6 - node.js
you can use './' as a prefix for your path.
in your example, you will write:
fs.writeFile('./avatar/myFile.png', data.file, (err) => {
if (err) {
return console.log(err);
}
console.log("The file was saved!");
});
Solution 7 - node.js
It tells you that the avatar
folder does not exist.
Before writing a file into this folder, you need to check that a directory called "avatar"
exists and if it doesn't, create it:
if (!fs.existsSync('/avatar')) {
fs.mkdirSync('/avatar', { recursive: true});
}
Solution 8 - node.js
I had this error because I tried to run:
fs.writeFile(file)
fs.unlink(file)
...lots of code... probably not async issue...
fs.writeFile(file)
in the same script. The exception occurred on the second writeFile
call. Removing the first two calls solved the problem.
Solution 9 - node.js
In my case, I use async fs.mkdir()
and then, without waiting for this task to complete, I tried to create a file fs.writeFile()
...
Solution 10 - node.js
As SergeS mentioned, using /
attempts to write in your system root folder, but instead of using __dirname, which points to the path of the file where writeFile is invoked, you can use process.cwd() to point to the project's directory. Example:
writeFile(`${process.cwd()}/pictures/myFile.png`, data, (err) => {...});
If you want to avoid string concatenations/interpolations, you may also use path.join(process.cwd(), 'pictures', 'myFile.png')
(more details, including directory creation, in this digitalocean article).