我将所有.png
文件转换为目录中的.jpg
文件,然后对它们运行一些操作,这些操作只能转换为jpeg
文件。但是node.js
似乎不会注意到转换后的文件和已删除的png文件,直到我再次运行相同的脚本。
const fs = require('fs')
const pngToJpeg = require('png-to-jpeg');
let dirrCont = fs.readdirSync( dir );
files = dirrCont.filter( ( elm ) => /.*\.(png|jpg)/gi.test(elm) );
for (i in files)
{
let file = files[i]
let file_name_without_ext = file.replace(/\.[^/.]+$/, "")
let extension = file.match(/\.[^/.]+$/)
if (extension[0] == '.png')
{
console.log('found')
let buffer = fs.readFileSync(dir+file);
pngToJpeg({quality: 100})(buffer)
.then(output => fs.writeFileSync(dir+file_name_without_ext+'.jpg', output));
fs.unlinkSync(dir+file)
extension = '.jpg'
}
let target_file = target + file_name_without_ext + '.' + suffix + extension
// do some manipulations on dir+file_name_without_ext+extension
我总是收到这样的错误:找不到新的jpg文件,因此尽管png
文件已转换为jpg
文件,但是这些操作无法进行。从现在起,我再次运行同一脚本时,所有文件均为jpeg
,这一次将运行文件操作。
如@CertainPerformance的答案之一所建议 我更改了代码以在then块内完成大部分工作,但再次遇到相同的错误
for (i in files)
{
let file = files[i]
let file_name_without_ext = file.replace(/\.[^/.]+$/, "")
let extension = file.match(/\.[^/.]+$/)
if (extension[0] == '.png')
{
console.log('found')
let buffer = fs.readFileSync(dir+file);
pngToJpeg({quality: 100})(buffer)
.then(output => {
fs.writeFileSync(dir+file_name_without_ext+'.jpg', output);
extension = '.jpg'
//
let target_file = target + file_name_without_ext + '.' + suffix + extension
// Do some manipulations
// I am done with the manipulations and I now want to delete
// the jpg file I just created
fs.unlinkSync(dir+file_name_without_ext+'.jpg') // Gives me back the same error
});
}
注意::编辑中有一些更改,我将删除jpg
文件而不是png
文件(我原来是这样做的)
答案 0 :(得分:3)
从.then
可以看出,pngToJpeg
是异步的-如果要在dir+file_name_without_ext
上进行工作,则必须等待初始的.then
和writeFileSync
首先解决。将所有依赖于异步操作的内容放入then
中。例如:
if (extension[0] == '.png') {
console.log('found');
const buffer = fs.readFileSync(dir + file);
pngToJpeg({ quality: 100 })(buffer)
.then(output => {
fs.unlinkSync(dir + file);
fs.writeFileSync(dir + file_name_without_ext + '.jpg', output);
extension = '.jpg';
const target_file = target + file_name_without_ext + '.' + suffix + extension;
// do some manipulations on dir+file_name_without_ext+extension
});
}
(您还应注意不要隐式创建全局变量。例如,使用for (const i in files)
或使用for (const file of files)
来避免摆弄无关紧要的索引)