Comumente quando estamos desenvolvendo nossas aplicações precisamos de tarefas corriqueiras para realizar o objetivo final do nosso projeto.
Uma das coisas mais frequentes, dentre outras, é listar arquivos de um diretório e geralmente recorremos a internet, no entanto, é muito simples de entender a lógica e fixarmos esse conceito para diminuirmos a perda de tempo realizando pesquisa.
Nessa dica rápida veremos como fazer isso de forma moderna com C++.
filesystem
A biblioteca filesystem
fornece recursos para executar operações em sistemas de arquivos e seus componentes, como caminhos, arquivos regulares e diretórios.
Ela foi originalmente desenvolvida pela Boost e na versão C++ 17
ela foi finalmente adotada pelo comitê para fazer parte da biblioteca padrão(STL).
Para usá-la incluiremos:
O namespace
dela é muito grande, logo, é sempre interessante reduzir o caminho simplificando para fs
somente, e isso é bom ser feito logo após a inclusão do cabeçalho:
Se estiver usando um linter, pode ser que ele acuse o warning:
■ Namespace alias decl 'fs' is unused (fix available)
, isso é porque declaramos, mas ainda não usamos no nosso código, porém já já usaremos!
Agora vamos criar uma string que armazenará a pasta/diretório que queremos listar os arquivos(ex.: /path/to/directory
), para esse exemplos listaremos o diretório atual mesmo:
E para listar os arquivos usaremos um Range-based for loop que também é carinhosamente confundido com for-each e percorremos nossa pasta utilizando um iterador nativo da filesystem
que é o directory_iterator()
e dentro do loop printaremos o elemento que nada mais é que o(s) arquivos do diretório, usando a função-mebro path()
:
Lembrando que se houver um subdiretório ele também listará.
Após compilar normalmente e rodar, você notará os arquivos(e/ou diretórios, se houver) sendo listados.
Se quiser ter certeza que os arquivos estão sendo listado um de cada vez, você pode pausar a exibição com um sleep:
Nesse caso haverá um atraso de 1 segundo na exibição.
O código completo é:
A pausa está comentada!
Suponhamos que você tenham diversos arquivos assim: file1.jpg, file2.jpg,...file.10.jpg, ... file31.jpg
, ao listar eles não aparecerão em ordem alfabética.
Para resolver isso, além de respeitar a ordem das dezenas, adicione os cabeçalhos:
Crie uma função com um lambda interna:
E agora ordene o vector com sort:
Dessa forma resolveremos ambos os problemas: ordem alfabética e respeito das dezenas!
Código completo:
Para mais informações acesse: https://en.cppreference.com/w/cpp/filesystem.