Eu já li a documentação do Node.js e, a menos que tenha perdido algo, ele não informa o que os parâmetros contêm em determinadas operações, em particular fs.mkdir()
. Como você pode ver na documentação, não é muito.
Atualmente, eu tenho esse código, que tenta criar uma pasta ou usar uma existente:
fs.mkdir(path,function(e){
if(!e || (e && e.code === 'EEXIST')){
//do something with contents
} else {
//debug
console.log(e);
}
});
Mas eu me pergunto: esse é o caminho certo para fazer isso? A verificação do código é EEXIST
a maneira correta de saber se a pasta já existe? Eu sei que posso fazer fs.stat()
antes de criar o diretório, mas isso já seria duas ocorrências no sistema de arquivos.
Em segundo lugar, existe uma documentação completa ou pelo menos mais detalhada do Node.js que contém detalhes sobre quais objetos de erro contêm, quais parâmetros significam etc.
javascript
node.js
Joseph
fonte
fonte
e &&
. Se!e
falhar, você sabe quee
é verdade.Respostas:
Uma boa maneira de fazer isso é usar o módulo mkdirp .
Use-o para executar a função que requer o diretório. O retorno de chamada é chamado depois que o caminho é criado ou se o caminho já existe. O erro
err
será definido se o mkdirp falhar ao criar o caminho do diretório.fonte
fs.exists(Sync)
.Editar: como essa resposta é muito popular, eu a atualizei para refletir as práticas atualizadas.
Nó> = 10
A nova
{ recursive: true }
opção do Nodefs
agora permite isso de forma nativa. Esta opção imita o comportamento do UNIXmkdir -p
. Ele recursivamente garantirá que todas as partes do caminho existam e não emitirá um erro se houver alguma.(Nota: ele ainda pode gerar erros como
EPERM
ouEACCESS
, portanto, melhor ainda envolvê-lotry {} catch (e) {}
se sua implementação for suscetível a ele.)Versão síncrona.
Versão assíncrona
Versões mais antigas do nó
Usando a
try {} catch (err) {}
, você pode conseguir isso com muita graciosidade sem encontrar uma condição de corrida.Para evitar o tempo morto entre a verificação da existência e a criação do diretório, simplesmente tentamos criá-lo diretamente e desconsideramos o erro, se houver
EEXIST
(o diretório já existe).Se o erro não for
EEXIST
, no entanto, devemos gerar um erro, porque poderíamos estar lidando com algo como umEPERM
ouEACCES
Para
mkdir -p
-como comportamento recursivo, por exemplo./a/b/c
, você teria que chamá-lo em todas as partes do dirpath, por exemplo./a
,./a/b
,.a/b/c
fonte
Se você deseja um liner rápido e sujo, use o seguinte:
fonte
fs.exists
está obsoleto: nodejs.org/api/fs.html#fs_fs_exists_path_callbackO node.js documenta
fs.mkdir
basicamente adira à página de manual do Linux paramkdir(2)
. Isso indica queEEXIST
também será indicado se o caminho existe, mas não é um diretório que cria uma caixa de canto estranha se você seguir esta rota.Pode ser melhor ligar para
fs.stat
se o caminho existe e se é um diretório em uma única chamada. Pois (o que eu suponho) é o caso normal em que o diretório já existe, é apenas um único hit no sistema de arquivos.Esses
fs
métodos de módulo são invólucros finos em torno das APIs C nativas, portanto você deve verificar as páginas de manual mencionadas nos documentos node.js. para obter detalhes.fonte
stat
antesmkdir
tem o potencial para uma condição de corrida - tenha isso em mente.Você pode usar isto:
fonte
statSync
lançará um erro se a entidade não existir, travando o código. Você precisa agrupar isso em umtry/catch
bloco.fs.existsSync()
efs.exists()
será substituído.Proponho uma solução sem módulos (os módulos acumulados nunca são recomendados para manutenção, especialmente para pequenas funções que podem ser escritas em poucas linhas ...):
ÚLTIMA ATUALIZAÇÃO :
Na v10.12.0, as opções recursivas da implementação do NodeJS:
ATUALIZAÇÃO:
fonte
fs.exists()
foi descontinuado no nó v9. use emfs.access()
vez disso. (retornosundefined
se o arquivo existir, caso contrário gera um erroENOENT
)fs.mkdirSync('my/new/folder/create', {recursive: true})
?Você também pode usar fs-extra , que fornece muitas operações de arquivos usadas com frequência.
Código de amostra:
docs aqui: https://github.com/jprichardson/node-fs-extra#mkdirsdir-callback
fonte
Aqui está o código ES6 que eu uso para criar um diretório (quando ele não existe):
Nota:
createDirectory
função, eu normalizar o caminho para a garantia de que o tipo seperator caminho do sistema operacional será usado de forma consistente (por exemplo, isso vai se transformarC:\directory/test
emC:\directory\test
(quando estar no Windows)fs.exists
está obsoleto , é por isso que eu usofs.stat
para verificar se o diretório já existeENOENT
( E rror NO ENT ry)fs.mkdir
fs.mkdir
que a contraparte de bloqueiofs.mkdirSync
e, devido ao empacotamentoPromise
, será garantido que o caminho do diretório seja retornado somente após o diretório ter sido criado com êxito.fonte
É melhor não contar os hits do sistema de arquivos enquanto codifica em Javascript, na minha opinião. No entanto, (1)
stat
&mkdir
e (2)mkdir
e cheque (ou descartar) o código de erro, ambos os caminhos são caminhos certos para fazer o que quiser.fonte
fonte
Você pode fazer tudo isso com o módulo Sistema de arquivos.
Você realmente nem precisa verificar se o diretório existe. O código a seguir também garante que o diretório já exista ou seja criado.
fonte
A resposta de Raugaral, mas com a funcionalidade -p. Feio, mas funciona:
fonte
Assim como uma alternativa mais nova à resposta de Teemu Ikonen , que é muito simples e de fácil leitura, é usar o
ensureDir
método dafs-extra
pacote.Ele não só pode ser usado como um substituto flagrante do
fs
módulo embutido , mas também possui muitas outras funcionalidades, além das funcionalidades dofs
pacote.O
ensureDir
método, como o nome sugere, garante que o diretório exista. Se a estrutura de diretórios não existir, ela será criada. Gostarmkdir -p
. Não apenas a pasta final, o caminho inteiro é criado, se já não existir.o fornecido acima é a sua
async
versão. Ele também possui um método síncrono para executar isso na forma doensureDirSync
método.fonte
A resposta do @ Liberateur acima não funcionou para mim (nó v8.10.0). Poucas modificações foram suficientes, mas não tenho certeza se esse é o caminho certo. Por favor sugira.
fonte