Tengo un código que me ayuda a cambiar el nombre de varios archivos con datos. En los datos (rarityList) hay un nombre y un valor para cada archivo que tengo. Por el bien de la publicación, acabo de reemplazar los valores con un dummy, pero puedes imaginar que hay 500 de ellos.
Funciona y hace el trabajo pero de una manera que no pretendía. En la terminal, primero imprime 0 (total), luego copia todos los archivos y luego le cambia el nombre. Pero esperaba ver algo como ¡La copia está lista! y el cambio de nombre está hecho! y finalmente número total al final de la terminal. ¿Podría explicarme lo que me estoy perdiendo aquí?
const fs = require("fs"); const path = "C:\\Users\\shepard\\Desktop\\Head"; const newPath = "C:\\Users\\shepard\\Desktop\\NewHead"; let files = fs.readdirSync(path); const rarityList = [{name: "a", value: 3},{name: "b", value: 2}]; let total = 0; const copy = async (_e) => { fs.copyFile(path + "\\" + _e, newPath + "\\" + _e, err => {if (err) {console.log(err)}}); }; const rename = async (_e, _index) => { let t = _e.replace(".png", "#" + rarityList[_index].value + ".png") fs.rename(newPath + "\\" + _e, newPath + "\\" + t, err => {if (err) {console.log(err)}}); }; files.forEach(async (e) => { await copy(e); console.log("Copying is done!"); rarityList.forEach(async (element, index) => { if (element.name == e.slice(0,-4)) { await rename(e,index); console.log("Renaming is done! for " + e + " with the rarity weight of " + rarityList[index].value); total += rarityList[index].value; }; }); }); console.log(total);Posiblemente no sea la mejor respuesta, sino una solución:
const fs = require("fs"); const path = "C:\\Users\\shepard\\Desktop\\Head"; const newPath = "C:\\Users\\shepard\\Desktop\\NewHead"; let files = fs.readdirSync(path); const rarityList = [ { name: "a", value: 3 }, { name: "b", value: 2 }, ]; let total = 0; const copy = async (_e) => { fs.copyFile(path + "\\" + _e, newPath + "\\" + _e, (err) => { if (err) { console.log(err); } }); }; const rename = async (_e, _index) => { let t = _e.replace(".png", "#" + rarityList[_index].value + ".png"); fs.rename(newPath + "\\" + _e, newPath + "\\" + t, (err) => { if (err) { console.log(err); } }); }; const renameFiles = async () => { for (let e of files) { await copy(e); let index = 0; for (let element of rarityList) { if (element.name == e.slice(0, -4)) { await rename(e, index); console.log( "Renaming is done! for " + e + " with the rarity weight of " + rarityList[index].value ); total += rarityList[index].value; } index += 1; } } console.log('in async func', total); }; renameFiles(); console.log('out of async function', total);El truco es que no se espera la función asíncrona, por lo que el total no se actualiza en el "nivel superior". Puedes hacer una espera de "nivel superior" así:
const fs = require("fs"); const path = "C:\\Users\\shepard\\Desktop\\Head"; const newPath = "C:\\Users\\shepard\\Desktop\\NewHead"; let files = fs.readdirSync(path); const rarityList = [ { name: "a", value: 3 }, { name: "b", value: 2 }, ]; let total = 0; const copy = async (_e) => { fs.copyFile(path + "\\" + _e, newPath + "\\" + _e, (err) => { if (err) { console.log(err); } }); }; const rename = async (_e, _index) => { let t = _e.replace(".png", "#" + rarityList[_index].value + ".png"); fs.rename(newPath + "\\" + _e, newPath + "\\" + t, (err) => { if (err) { console.log(err); } }); }; const renameFiles = async () => { for (let e of files) { await copy(e); let index = 0; for (let element of rarityList) { if (element.name == e.slice(0, -4)) { await rename(e, index); console.log( "Renaming is done! for " + e + " with the rarity weight of " + rarityList[index].value ); total += rarityList[index].value; } index += 1; } } console.log("in function", total); }; (async function() { await renameFiles() console.log(total) }());