Preciso gravar o arquivo no seguinte caminho:
fs.writeFile('/folder1/folder2/file.txt', 'content', function () {…});
Mas o '/folder1/folder2'
caminho pode não existir. Portanto, recebo o seguinte erro:
mensagem = ENOENT, abra /folder1/folder2/file.txt
Como posso escrever conteúdo para esse caminho?
fs.promises.mkdir(path.dirname('/folder1/folder2/file.txt'), {recursive: true}).then(x => fs.promises.writeFile('/folder1/folder2/file.txt', 'content'))
Respostas:
Use mkdirp em combinação com
path.dirname
first.Se todo o caminho já existe,
mkdirp
é um noop. Caso contrário, ele cria todos os diretórios ausentes para você.Este módulo faz o que você deseja: https://npmjs.org/package/writefile . Peguei ao pesquisar por "writefile mkdirp" no Google. Este módulo retorna uma promessa em vez de receber um retorno de chamada, portanto, certifique-se de ler alguma introdução às promessas primeiro. Na verdade, pode complicar as coisas para você.
A função que dei funciona em qualquer caso.
fonte
fs.promises.mkdir(path.dirname(file), {recursive: true}).then(x => fs.promises.writeFile(file, data))
Acho que a maneira mais fácil de fazer isso é usar o método outputFile () do módulo fs-extra .
Exemplo:
Ele também promete suporte fora da caixa nos dias de hoje!
fonte
Talvez de forma mais simples, você pode apenas usar o módulo npm fs-path .
Seu código ficaria assim:
fonte
Editar
O NodeJS versão 10 adicionou um suporte nativo para ambos
mkdir
emkdirSync
para criar o diretor pai recursivamente comrecursive: true
as seguintes opções:E se preferir
fs Promises API
, pode escreverResposta Original
Crie os diretórios pais recursivamente se eles não existirem! ( Zero dependências )
Uso
Demo
Tente!
Explicações
EISDIR
para Mac eEPERM
eEACCES
para Windows.{isRelativeToScript: true}
.path.sep
epath.resolve()
, não apenas/
concatenação, para evitar problemas de plataforma cruzada.fs.mkdirSync
e manipulando o erro comtry/catch
if lançado para lidar com condições de corrida: outro processo pode adicionar o arquivo entre as chamadas parafs.existsSync()
efs.mkdirSync()
e causa uma exceção.if (!fs.existsSync(curDir) fs.mkdirSync(curDir);
,. Mas esse é um antipadrão que deixa o código vulnerável a condições de corrida.fonte
Você pode usar
stats
é umfs.Stats
tipo de objeto, você pode verificarstats.isDirectory()
. Dependendo do exameerr
estats
você pode fazer algo,fs.mkdir( ... )
ou lançar um erro.Referência
Atualização: corrigidas as vírgulas no código.
fonte
Esta é minha função personalizada para criar diretórios recursivamente (sem dependências externas):
fonte
Aqui está minha função que funciona no Node 10.12.0. Espero que isso ajude.
fonte
Com node-fs-extra, você pode fazer isso facilmente.
Instale-o
Em seguida, use o método outputFile em vez de writeFileSync
fonte
Aqui está parte da resposta de Myrne Stol dividida como uma resposta separada:
fonte
fonte