
Boost surgiu com o propósito de ser um repositório de bibliotecas que impedissem os programadores de terem de reinventar a roda e se tornou o primeiro lugar a ser procurar por software open source de qualidade com este propósito.
Boost é o produto de uma idéia de criar um repósitorio de bibliotecas open source e de alta qualidade que passam por um extensivo processo de revisão. Boost possui mais de 80 bibliotecas que podem ser incluídas em seus programas C++ sem medo de errar pois estão entre os melhores e mais portáteis componentes do mundo C++.
Hoje vou falar um pouco sobre uma dessas bibliotecas, a Filesystem.
Primeiro, será necessário instalar o pacote libboost-filesystem1.40-dev faça:
sudo apt-get install libboost-filesystem1.40-dev
Criamos um arquivo operacoesDiretorio.cpp
#include "boost/filesystem.hpp"
#include <iostream>
namespace bfs = boost::filesystem;
int main (int argc, char* argv[]) {
if (argc != 2) {
std::cerr << "numero de argumentos invalidos" << std::endl;
return 1;
}
bfs::path caminho (argv[1]);
if (!bfs::exists(caminho)) {
std::cerr << "Caminho nao existe" << std::endl;
return 1;
}
if (bfs::is_directory(caminho)) {
bfs::directory_iterator dir_itr (caminho);
bfs::directory_iterator end_itr;
for (; dir_itr != end_itr; ++dir_itr) {
//listar tudo dentro da pasta
// std::cout << dir_itr->path().filename() << std::endl;
//listar somente diretorios
// if (bfs::is_directory (dir_itr->status()))
// std::cout << dir_itr->path().filename() << std::endl;
//listar arquivos regulares
if (bfs::is_regular_file (dir_itr->status()))
std::cout << dir_itr->path().filename() << std::endl;
}
}
else //nao eh um diretorio
std::cout << caminho.leaf() << " nao eh um diretorio" << std::endl;
}
Compile o programa incluindo -lboost_filesystem:
g++ operacoesDiretorio.cpp -lboost_filesystem -o operacoesDiretorio
Na linha 4 criei um alias para o namespace boost::filesystem para tornar mais simples sua utilização no programa. O programa recebe um argumento pelo terminal que representa o diretório que deve ser aberto e ter seu conteúdo listado.
Na linha 12, com o diretório fornecido, criamos a variável caminho do tipo path que é o tipo responsável por representar diretórios de forma indepentende de plataforma.
Para percorrer o conteúdo do diretório criamos um iterador fazendo:
bfs::directory_iterator dir_itr (caminho);
e
bfs::directory_iterator end_itr;
que quando criado pelo construtor default, cria um iterador que aponta para o fim de um diretório.
O resto do programa deve ser auto explicativo, sendo interessante notar as interessantes funções: bfs::is_directory() e bfs::is_regular_file() que são sobrecarregadas para receber como parametro tanto um file_status que contem informações sobre o arquivo, com um path. A função leaf retorna o nome do arquivo ou diretório por exemplo, se o caminho for /home/user/teste.txt a função leaf retorna a string teste.txt.
A parte comentada mostra as outras manipulações possíveis sobre o caminho.