Javascript node.js在文件中所做的更改直到第二次运行时才会反映出来
我正在将目录中的所有Javascript node.js在文件中所做的更改直到第二次运行时才会反映出来,javascript,node.js,Javascript,Node.js,我正在将目录中的所有.png文件转换为.jpg文件,然后对它们执行一些操作,这些操作只能转换为jpeg文件。但是node.js似乎没有注意到转换的文件和删除的png文件,直到我再次运行相同的脚本 const fs = require('fs') const pngToJpeg = require('png-to-jpeg'); let dirrCont = fs.readdirSync( dir ); files = dirrCont.filter( ( el
.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
文件(我原来是这样做的),你可以通过看到。
,pngToJpeg
是异步的-如果你想在dir+file\u name\u上工作,而不使用
,您必须先等待初始的。然后和writeFileSync
解析。将依赖于异步操作的所有内容放入中,然后
。例如:
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(文件中的常量i)
,或者For(文件中的常量文件)
以避免处理不重要的标记)好的建议。请您解释一下第二部分,为什么最好使用for(文件中的常量文件)
或for(文件中的常量文件)
以及两者之间的区别是什么?当您有一个数组时,for..of
将迭代数组的值,而for..in
迭代数组的标记。如果您只使用数组的值,并且只关心标记以便可以获取值,请改用for..of
。(或者,更好的是,使用数组方法,比如forEach
),这很神奇。感谢您的解释,我从来没有在问题中添加过编辑,您的解决方案帮助了我,但不是完全帮助了我,仍然有一些事情发生了,我没有得到,删除jpg
文件回到中,然后
再次给我文件未找到的错误更具体地说(节点:98477)UnhandledPromisejectionWarning:错误:eNote:没有这样的文件或目录,
要开始调试,您可以检查一下在writeFileSync
之后调用unlinkSync
时会发生什么,只是为了简化一点。我想知道通过writeFileSync
创建的文件是否会立即创建,或者它们是否需要几毫秒的时间才能显示并使用。(可能尝试设置一个较短的setTimeout
,看看会发生什么?@CertainPerformance我运行的操作,我使用的是jimp库,这肯定需要保存文件present@CertainPerformance但是超时是有效的,因为库要求文件存在,但是当您稍后调用unlinkSync
时会抛出错误,这听起来像是导致问题的代码在您的中的某个位置执行一些操作
-可能文件在其中被删除,这就是unlinkSync
无法工作的原因<代码>取消链接同步
应该可以工作,即使在writeFileSync
之后。