没有这样的文件或目录

我有一个文件(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'
101749 次浏览

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.

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.

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

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.

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

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.

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

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()...

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

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).