Como describe el título, me gustaría leer todos los archivos de un directorio específico y devolver los nombres de todos los archivos que tienen una cadena específica en su contenido.
Así es como se ve mi código hasta ahora:
const dirname = path.resolve("./results/"); async function readFiles(dirname) { const allResults = [] fs.readdir(dirname, function(err, filenames) { if (err) { console.log(err); return; } filenames.forEach(async function(filename) { fs.readFile(dirname + "/" + filename, 'utf-8', function(err, content) { if (err) { console.log(err); return; } if (content.includes('content string')) { allResults.push(filename); } }); }); }); return allResults; } readFiles(dirname).then((res) => { console.log(res); }) El resultado que obtengo es []
así que entiendo que es un problema con las promesas y las funciones asíncronas, sin embargo, este no es un concepto que comprenda completamente todavía, y a pesar de probar varias combinaciones de posibilidades ( new Promise() , o .then , .then , o await y readdirSync ) readFileSync sin éxito.
¿Qué me falta para que devuelva la matriz allResults solo una vez que se hayan leído todos los archivos?
Debe deshacerse de la sintaxis de devolución de llamada y usar fs.promises Api. Esto se ve mucho más limpio
const fs = require("fs").promises; const path = require("path"); const dirname = path.resolve("./results/"); async function readDir(dirname) { const allResults = []; try { const files = await fs.readdir(dirname); for (const fileName of files) { try { const content = await fs.readFile(`${dirname}/${fileName}`, { encoding: "utf-8" }); if (content.includes("content string")) { allResults.push(fileName); } } catch (error) { console.log(error.message); } } return allResults; } catch (error) { console.log(error); } } readDir(dirname).then(data => { console.log(data); });