One way to list the files is through the FindFirstFile
and FindNextFile
(Windows):
#include <windows.h> /* Para usar as funções de busca de arquivos */
#include <vector> /* Para usar */
#include <sstream> /* Para usar o Stringstream */
#include <iostream> /* Para manipular a entrada/saída de streams */
#include <fstream> /* Para usar o ifstream */
....
using namespace std;
...
vector<string> ProcurarArquivos(string diretorio) {
vector<string> arquivos; /* Vetor que irá armazenar os resultados temporários */
string busca = diretorio + "\*.txt"; /* Cria o filtro, no diretório será encontrado somente arquivos .txt */
HANDLE hFind; /* Identificador da pesquisa */
WIN32_FIND_DATA data; /* Estrutura que conterá informações dos arquivos */
hFind = FindFirstFile(busca.c_str(), &data); /* Procura pelo primeiro arquivo */
if (hFind != INVALID_HANDLE_VALUE) { /* Se a função não falhar */
do {
arquivos.push_back(data.cFileName); /* Armazena no vetor o nome do arquivo encontrado */
} while (FindNextFile(hFind, &data)); /* Procura pelo próximo arquivo */
FindClose(hFind); /* Fecha o identificador da pesquisa */
}
return arquivos; /* Retorna o vetor como resultado */
}
To read the contents of the file and return in a string , do:
string LerAquivo(string arquivo) {
ifstream ifs; /* Stream usada para fazer operações em arquivos */
ifs.exceptions (ifstream::failbit | ifstream::badbit); /* Define quais exceções podem ser lançadas */
try { /* Tenta executar o código abaixo */
ifs.open(arquivo.c_str()); /* Abre o arquivo */
stringstream ss; /* Stringstream que vai conter o resultado */
ss << ifs.rdbuf(); /* Lê o buffer do stream e coloca no Stringstream */
string str = ss.str(); /* Coloca numa string o resultado do Stringstream */
return str; /* Retorna a string */
}
catch (ifstream::failure e) { /* Se houver erros em relação a leitura dos arquivos */
/* Fazer alguma coisa aqui caso ocorram erros */
return ""; /* Retorna uma string vazia */
}
}
To get the path of the application use the GetModuleFileName
:
string DiretorioDaAplicacao() {
char buffer[MAX_PATH]; /* Cria um buffer com tamanho máximo para um diretório */
GetModuleFileName(NULL, buffer, MAX_PATH); /* Para retornar o caminho completo do executável */
int pos = string(buffer).find_last_of("\/"); /* Captura a posição da última barra "/" */
return string(buffer).substr(0, pos); /* Extraí tudo desde o início até o ponto onde foi encontrado a barra "/" */
}
To extract only the file name, use the function:
string ExtrairNomeDoArquivo(string caminho) {
int indice = caminho.rfind('/'); /* Encontra o índice da última ocorrência da barra "/" */
return caminho.substr(indice + 1); /* Extraí tudo a partir do índice da barra "/" */
}
Note : It works only on Windows, and there are times when this function might fail.
Example usage:
int main() {
string Diretorio = DiretorioDaAplicacao(); /* Captura o diretório da aplicação */
vector<string> arquivos = ProcurarArquivos(Diretorio); /* Cria um vetor que armazenará os o caminho dos arquivos encontrados */
for (vector<string>::iterator i = arquivos.begin(); i != arquivos.end(); i++) { /* Faz a iteração sobre o vetor "arquivos" */
string conteudo = LerAquivo(*i); /* Coloca na variável o conteúdo do arquivo atual da iteração */
string arquivo = ExtrairNomeDoArquivo(*i); /* Coloca na variável somente o nome do arquivo atual da iteração */
cout << "Nome do arquivo: " << arquivo << endl;
cout << conteudo << endl;
}
cin.get(); /* Espera o usuário digitar algo*/
return 0; /* Termina o programa */
}