No meu aplicativo Nó, preciso remover um diretório que possui alguns arquivos, mas fs.rmdir
funciona apenas em diretórios vazios. Como posso fazer isso?
node.js
filesystems
sachin
fonte
fonte
fs.readdir(dirPath)
para uma variedade de caminhos em uma pasta, repitafs.unlink(filename)
para excluir cada arquivo e, finalmente,fs.rmdir(dirPath)
para excluir a pasta agora vazia. Se você precisar se recuperar, verifiquefs.lstat(filename).isDirectory()
.Respostas:
Existe um módulo para isso chamado
rimraf
( https://npmjs.org/package/rimraf ). Ele fornece a mesma funcionalidade querm -Rf
Uso assíncrono :
Uso da sincronização :
fonte
deleteFolderRecursive
na resposta a seguir?recursive
opção: stackoverflow.com/a/57866165/6269864Para remover a pasta de forma síncrona
fonte
var curPath = path + "/" + file;
por,var curPath = p.join(path, file);
desde que você inclua o módulo path:var p = require("path")
path.join(dirpath, file)
deve ser melhor quepath + "/" + file
A maioria das pessoas que usam
fs
Node.js gostaria de funções próximas à "maneira Unix" de lidar com arquivos. Estou usando o fs-extra para trazer todas as coisas legais:Melhor ainda, o fs-extra é uma queda no substituto do fs nativo. Todos os métodos em fs não são modificados e estão anexados a ele. Isso significa que você pode substituir fs por fs-extra :
E então você pode remover uma pasta da seguinte maneira:
fonte
removeSync('/tmp/myFolder')
A partir de 2019 ...
A partir de Node.js 12.10.0 ,
fs.rmdirSync
suporta umrecursive
opções, para que possa finalmente fazer:Onde a
recursive
opção exclui o diretório inteiro recursivamente.fonte
recursive: true
e exclui pastas não vazias sem reclamação.fs.rmdir(path[, options], callback)
oufs.rmdirSync(path[, options])
fs.rmdir
é experimental com estabilidade 1. "Estabilidade: 1 - Experimental. O recurso não está sujeito às regras de versão semântica. Alterações ou remoção não compatíveis com versões anteriores podem ocorrer em qualquer versão futura. O uso do recurso não é recomendado em ambientes de produção ".Minha resposta modificada de @oconnecp ( https://stackoverflow.com/a/25069828/3027390 )
Usa path.join para uma melhor experiência entre plataformas. Portanto, não esqueça de exigir.
Também renomeada função para
rimraf
;)fonte
Normalmente, eu não ressuscito tópicos antigos, mas há muita rotatividade aqui e sem a resposta do rimraf, tudo isso parece muito complicado para mim.
Primeiro no Nó moderno (> = v8.0.0), você pode simplificar o processo usando apenas módulos principais do nó, totalmente assíncronos e paralelizar a desvinculação de arquivos simultaneamente, tudo em uma função de cinco linhas e ainda manter a legibilidade:
Em outra nota, um protetor para ataques de travessia de caminho é inadequado para essa função porque
rm -rf
pois é necessário um argumento e permitirá que o usuáriorm -rf /
solicite. Seria responsabilidade de um script não proteger orm
próprio programa..isDirectory()
éfalse
para sym-links e não são desvinculados recursed em.Por último, mas não menos importante, há uma rara condição de corrida em que a recursão poderá ocorrer erro se uma das entradas for desvinculada ou excluída fora deste script no momento certo enquanto essa recursão estiver em execução. Como esse cenário não é típico na maioria dos ambientes, provavelmente pode ser esquecido. No entanto, se necessário (para alguns casos extremos), esse problema pode ser mitigado com este exemplo um pouco mais complexo:
EDIT: Faça
isDirectory()
uma função. Remova o diretório real no final. Corrija a recursão ausente.fonte
await
seuPromise.all(…)
; isso é intencional? Parece que em seu estado atualresults.forEach
iteraria sobre as promessas, enquanto o código espera iterar sobre os resultados. Estou esquecendo de algo?if (!fs.existsSync(dir)) return
readdir
irá lançar um erro como deveria. Se vocêrmdir non-existing-dir
o código de saída for um erro. Seria responsabilidade do consumidor tentar / capturar. Este é o mesmo método descrito na documentação do Nó quando se trata de usar funções fs. Eles esperam que você tente capturar e observe os erroscode
para determinar o que fazer. Um cheque extra introduz uma condição de corrida.fs.exists
for usada. PS, esta é uma ótima solução.Aqui está uma versão assíncrona da resposta do @ SharpCoder
fonte
Eu escrevi essa função chamada remover pasta. Ele removerá recursivamente todos os arquivos e pastas em um local. O único pacote necessário é assíncrono.
fonte
Se você estiver usando o nó 8+ deseja assincronicidade e não deseja dependências externas, aqui está a versão assíncrona / aguardada:
fonte
Versão assíncrona da resposta do @ SharpCoder usando fs.promises:
fonte
Eu cheguei aqui enquanto tentava acabar com o
gulp
e eu estou escrevendo para mais alcance.gulp-clean
reprovado porgulp-rimraf
gulp-rimraf
reprovado em favor dedelete-files-folders
Quando você deseja excluir arquivos e pastas usando
del
, você deve anexar/**
para exclusão recursiva.fonte
O pacote de fato é
rimraf
, mas aqui está minha pequena versão assíncrona:fonte
Na versão mais recente do Node.js (12.10.0 ou posterior), as
rmdir
funções de estilofs.rmdir()
,fs.rmdirSync()
efs.promises.rmdir()
têm uma nova opção experimentalrecursive
que permite a exclusão de diretórios não vazios, por exemplo,O PR relacionado no GitHub: https://github.com/nodejs/node/pull/29168
fonte
De acordo com a
fs
documentação ,fsPromises
atualmente fornece arecursive
opção experimentalmente, que, pelo menos no meu caso no Windows, remove o diretório e quaisquer arquivos nele.Os
recursive: true
arquivos são removidos no Linux e MacOS?fonte
Ultra velocidade e à prova de falhas
Você pode usar o
lignator
pacote ( https://www.npmjs.com/package/lignator ), é mais rápido que qualquer código assíncrono (por exemplo, rimraf) e mais à prova de falhas (especialmente no Windows, onde a remoção de arquivos não é instantânea e os arquivos podem ser bloqueado por outros processos).fonte
A pasta de sincronização é removida com os arquivos ou apenas com um arquivo.
Eu não sou muito doador nem colaborador, mas não consegui encontrar uma boa solução para esse problema e tive que encontrar o meu caminho ... espero que gostem :)
Funciona perfeito para mim com qualquer número de diretórios e subdiretórios aninhados. Cuidado com o escopo 'this' ao repetir a função, sua implementação pode ser diferente. No meu caso, essa função permanece no retorno de outra função, por isso estou chamando isso com isso.
fonte
Embora
recursive
seja uma opção experimental defs.rmdir
fonte
Atualização 2020
A partir da versão 12.10.0 recursiveOption foi adicionado para opções.
Observe que a exclusão recursiva é experimental .
Então você faria pela sincronização:
ou para assíncrono:
fonte
Basta usar o módulo rmdir ! é fácil e simples.
fonte
Outra alternativa é usar o
fs-promise
módulo que fornece versões promissificadas dosfs-extra
módulosvocê poderia escrever como este exemplo:
note: o assíncrono / espera requer uma versão recente do nodejs (7.6+)
fonte
Uma maneira rápida e suja (talvez para teste) poderia ser usar diretamente o método
exec
ouspawn
para chamar a chamada do SO para remover o diretório. Leia mais em NodeJs child_process .As desvantagens são:
Benefícios:
fonte
-f
sinalizador para garantir a segurança ou ao digitar que ele / ela não excluirá tudo.exec + rm
é um comando válido e útil no nó que eu uso frequentemente durante o teste.Eu gostaria que houvesse uma maneira de fazer isso sem módulos adicionais para algo tão minúsculo e comum, mas isso é o melhor que eu poderia criar.
Atualização: agora deve funcionar no Windows (Windows 10 testado) e também nos sistemas Linux / Unix / BSD / Mac.
fonte
child_process.execFile
que não chama o shell e passe argumentos explicitamente.Essa é uma abordagem usando o promisify e duas funções de ajuda (to e toAll) para resolver a promessa.
Ele executa todas as ações de forma assíncrona.
fonte
// sem uso de qualquer lib de terceiros
fonte
fs.unllinkSync(path.join(FOLDER_PATH, element);
fonte