Estou tentando gravar um arquivo em um diretório existente, usando node, path e fs.
Como deve funcionar:
- Inicializar dados simulados.
- Percorrer dados simulados.
- Escrever uma string simulada no diretório existente 'output'
- Fim do programa.
Como funciona:
- Inicializar dados simulados.
- Percorrer dados simulados.
- Tentar gravar no diretório existente.
- Erro de rendimento:
Erro:
throw new Error(`Error writing: ${err.message}`);
^
Error: Error writing: ENOENT: no such file or directory, open 'C:\Users\username\test\cheerio\output\55-207-0-228_2025-04-29_15:27:51.txt'
at C:\Users\username\test\cheerio\components\WriteFile.js:31:11
at node:fs:2385:7
at FSReqCallback.oncomplete (node:fs:188:23)
Repositório
Estou trabalhando neste repositório . A função que manipula o arquivo de gravação node:fs encontra-se em /component/WriteFile.js ; ela está sendo invocada aqui, nestas linhas .
Árvore do Projeto
Esta é a estrutura do projeto:
project-root/
├── components/
├── node_modules/
├── output/ // Target for file write.
├── .gitignore
├── index.js
├── LICENSE
├── package-lock.json
├── package.json
└── README.md
Trecho do WriteFile
Publicando código relevante aqui para sua conveniência. WriteFile.js
const fs = require('node:fs');
const path = require('path');
const makeFile = async (fileName, { contentString, ip }) => {
const now = new Date();
const dateString =
now.getFullYear() +
'-' +
String(now.getMonth() + 1).padStart(2, '0') +
'-' +
String(now.getDate()).padStart(2, '0') +
'_' +
String(now.getHours()).padStart(2, '0') +
':' +
String(now.getMinutes()).padStart(2, '0') +
':' +
String(now.getSeconds()).padStart(2, '0');
contentString = `DATE: ${dateString}\nFor ip: ${ip}\n${contentString}`;
const filepath = path.join(
__dirname,
'..',
'output',
`${fileName}_${dateString}.txt`
);
try {
await fs.writeFile(filepath, contentString, 'utf16le', (err) => {
if (err) {
throw new Error(`Error writing: ${err.message}`);
}
});
return 'Success';
} catch (error) {
console.error('\nError:\n', error.message, '\n');
} finally {
// Code that will run regardless of try/catch result
// Remember, don't have a return in finally.
console.log('Final completed.');
}
};
module.exports = { makeFile };
Invocado em:
Que está sendo chamado de:
async function main() {
let start = performance.now();
let elapse;
i = 0;
for (const ip of ipList) {
i++;
if (i > 3) {
break;
}
const sleep = (ms) =>
new Promise((resolve) => {
setTimeout(resolve, ms);
});
await sleep(500);
await makeFile(ip.replaceAll('.', '-'), {
contentString: 'Mockdata',
ip: ip
});
}
elapse = performance.now() - start;
console.log('Total time elapsed: ', elapse / 1000);
}
O caractere dois pontos
55-207-0-228_2025-04-29_15:27:51.txt
é inválido no Windows. A pergunta não menciona a plataforma, mas o caminho do arquivo pressupõe isso.Deveria ser:
output
Não há garantia de que o diretório exista, pois ele não existe no repositório. Mesmo que exista no projeto atual, é necessário que existamkdir
para que funcione de forma consistente.Use
node:fs/promises
em vez denode:fs
se quiser usá-lo comasync..await
, caso contrário, naturalmente haverá problemas na ordem de execução e no tratamento de erros.