Eu esperava que isso fosse uma coisa simples, mas não consigo encontrar nada lá fora para fazê-lo.
Eu só quero obter todas as pastas / diretórios dentro de uma determinada pasta / diretório.
Então, por exemplo:
<MyFolder>
|- SomeFolder
|- SomeOtherFolder
|- SomeFile.txt
|- SomeOtherFile.txt
|- x-directory
Eu esperaria obter uma matriz de:
["SomeFolder", "SomeOtherFolder", "x-directory"]
Ou acima com o caminho, se foi assim que foi servido ...
Então, já existe alguma coisa para fazer o acima?
require('path').resolve(__dirname, file)
const getDirectories = srcPath => fs.readdirSync(srcPath).filter(file => fs.statSync(path.join(srcPath, file)).isDirectory())
lstatSync
vez disso.Graças aos recursos de sintaxe do JavaScript ES6 (ES2015), ele é único:
Versão síncrona
Versão assíncrona para Node.js 10+ (experimental)
fonte
Listar diretórios usando um caminho.
fonte
Solução recursiva
Eu vim aqui em busca de uma maneira de obter todos os subdiretórios e todos os subdiretórios, etc. Com base na resposta aceita , escrevi o seguinte:
fonte
if (recursive) return [srcpath, ...flatten(getDirectories(srcpath).map(getDirectoriesRecursive))]; else return [...flatten(getDirectories(srcpath).map(getDirectoriesRecursive))]; }
Isso deve servir:
CoffeeScript (sincronização)
CoffeeScript (assíncrono)
JavaScript (assíncrono)
fonte
fs
métodos síncronos .(err, dirs)
); não retornará a chamada na presença de arquivos ou pastas de ponto; é suscetível a todas as condições de corrida; pode ligar de volta antes de verificar todas as entradas.Como alternativa, se você puder usar bibliotecas externas, poderá usá-lo
filehound
. Ele suporta retornos de chamada, promessas e chamadas de sincronização.Usando promessas:
Usando retornos de chamada:
Sincronizar chamada:
Para obter mais informações (e exemplos), consulte os documentos: https://github.com/nspragg/filehound
Disclaimer: Eu sou o autor.
fonte
Com node.js versão> = v10.13.0, fs.readdirSync irá retornar uma matriz de fs.Dirent objetos se
withFileTypes
opção é definida comotrue
.Então você pode usar,
fonte
.filter(c => c.isDirectory())
seria mais simples de usarreduce()
.filter(c => c.isDirectory()).map(c => c.name)
areduce
ligação.fonte
Usando fs-extra, que promete as chamadas fs assíncronas, e a nova sintaxe async aguardada:
fonte
E uma versão assíncrona de getDirectories, você precisa do módulo assíncrono para isso:
fonte
Esta resposta não usa funções de bloqueio como
readdirSync
oustatSync
. Ele não usa dependências externas nem se encontra nas profundezas do inferno de retorno de chamada.Em vez disso, usamos conveniências modernas de JavaScript, como promessas e
async-await
sintaxes. E os resultados assíncronos são processados em paralelo; não sequencialmente -Vou instalar um pacote de exemplo e testarei nossa função -
Vamos ver isso funcionar -
Usando um módulo generalizado
Parallel
, podemos simplificar a definição dedirs
-O
Parallel
módulo usado acima era um padrão extraído de um conjunto de funções projetadas para resolver um problema semelhante. Para mais explicações, consulte as perguntas e respostas relacionadas .fonte
Versão CoffeeScript desta resposta , com o tratamento adequado de erros:
Depende do assíncrono
Como alternativa, use um módulo para isso! (Existem módulos para tudo. [Citação necessário])
fonte
Se você precisar usar toda a
async
versão. Você pode ter algo parecido com isto.Registre o comprimento do diretório, use-o como um indicador para saber se todas as tarefas estatísticas assíncronas foram concluídas.
Se as tarefas estatísticas assíncronas forem concluídas, todas as estatísticas do arquivo foram verificadas, portanto, chame o retorno de chamada
Isso funcionará apenas enquanto o Node.js for de thread único, pois assume que não há duas tarefas assíncronas que aumentarão o contador ao mesmo tempo.
Como você pode ver, essa é uma abordagem "profundidade primeiro" e isso pode resultar em um inferno de retorno de chamada, e não é bem "funcional". As pessoas tentam resolver esse problema com o Promise, envolvendo a tarefa assíncrona em um objeto Promise.
fonte
use fs 、 path module pode ter a pasta este uso Promise. Se você conseguir o preenchimento, poderá alterar isDirectory () para isFile () Nodejs - fs - fs.Stats . Por fim, você pode obter o arquivo'name file'extname e assim por diante Nodejs --- Path
fonte
A versão totalmente assíncrona com o ES6, apenas pacotes nativos, fs.promises e async / waitit, faz operações de arquivo em paralelo:
Testado, funciona bem.
fonte
Caso alguém mais chegue aqui a partir de uma pesquisa na web e tenha o Grunt já em sua lista de dependências, a resposta será trivial. Aqui está a minha solução:
fonte
Outra abordagem recursiva
Obrigado a Mayur por me conhecer
withFileTypes
. Escrevi o seguinte código para obter arquivos de uma pasta específica recursivamente. Pode ser facilmente modificado para obter apenas diretórios.fonte
programação funcional
fonte