Estive mexendo no Node.js e encontrei um pequeno problema. Eu tenho um script que reside em um diretório chamado data
. Quero que o script grave alguns dados em um arquivo em um subdiretório dentro do data
subdiretório. No entanto, estou recebendo o seguinte erro:
{ [Error: ENOENT, open 'D:\data\tmp\test.txt'] errno: 34, code: 'ENOENT', path: 'D:\\data\\tmp\\test.txt' }
O código é o seguinte:
var fs = require('fs');
fs.writeFile("tmp/test.txt", "Hey there!", function(err) {
if(err) {
console.log(err);
} else {
console.log("The file was saved!");
}
});
Alguém pode me ajudar a descobrir como fazer o Node.js criar a estrutura de diretórios se ela não sair para gravar em um arquivo?
javascript
node.js
Hirvesh
fonte
fonte
fs.promises.mkdir(path.dirname("tmp/test.txt"), {recursive: true}).then(x => fs.promises.writeFile("tmp/test.txt", "Hey there!"))
Respostas:
Nó> 10.12.0
O fs.mkdir agora aceita uma
{ recursive: true }
opção assim:ou com uma promessa:
Nó <= 10.11.0
Você pode resolver isso com um pacote como mkdirp ou fs-extra . Se você não deseja instalar um pacote, consulte a resposta de Tiago Peres França abaixo.
fonte
fs.promises
ainda é experimental nodejs.org/dist/latest-v10.x/docs/api/… #Se você não quiser usar nenhum pacote adicional, poderá chamar a seguinte função antes de criar seu arquivo:
fonte
statSync
em vez deexistsSync
, com base em stackoverflow.com/questions/4482686/...path
também é um pacote que precisa ser exigido da seguinte maneirafs
:var path = require('path')
caso alguém esteja se perguntando. Consulte a documentação do nó .fs.existsSync
não está obsoleto , apenasfs.exists
está.Com o nó-fs-extra você pode fazer isso facilmente.
Instale-o
Então use o
outputFile
método Sua documentação diz:Você pode usá-lo de três maneiras:
Estilo de retorno de chamada
Usando promessas
Se você usa promessas , e espero que sim, este é o código:
Versão de sincronização
Se você deseja uma versão de sincronização, basta usar este código:
Para uma referência completa, verifique a
outputFile
documentação e todos os métodos suportados pelo node-fs-extra .fonte
Alerta de plugue sem vergonha!
Você precisará verificar cada diretório na estrutura de caminho desejada e criá-lo manualmente, caso não exista. Todas as ferramentas para isso já estão no módulo fs do Node, mas você pode fazer tudo isso simplesmente com o meu módulo mkpath: https://github.com/jrajav/mkpath
fonte
Como ainda não posso comentar, estou postando uma resposta aprimorada com base na solução fantástica @ tiago-peres-frança (obrigado!). Seu código não cria diretório em um caso em que apenas o último diretório esteja ausente no caminho, por exemplo, a entrada é "C: / test / abc" e "C: / test" já existe. Aqui está um trecho que funciona:
fonte
abc
é interpretado como o arquivo para o qual você precisa criar um diretório. Para também criar oabc
diretório, adicione um arquivo fictício ao seu caminho, por exemploC:/test/abc/dummy.txt
.fs.promises.mkdir(path.dirname(file), {recursive: true}).then(x => fs.promises.writeFile(file, data))
Meu conselho é: tente não confiar nas dependências quando puder fazê-lo facilmente com poucas linhas de códigos
Aqui está o que você está tentando alcançar em 14 linhas de código:
fonte
return fs.lstatSync(dpath).isDirectory()
, caso contrário, o que aconteceria se isDirectory () retornar false?fs.promises.mkdir(path.dirname(file), {recursive: true}).then(x => fs.promises.writeFile(file, data))
Acabei de publicar este módulo porque precisava dessa funcionalidade.
https://www.npmjs.org/package/filendir
Ele funciona como um invólucro em torno dos métodos Node.js fs. Assim, você pode usá-lo exatamente da mesma maneira que você faria com
fs.writeFile
efs.writeFileSync
(ambos assíncrona e gravações síncronas)fonte