Curso completo de DarkGdk
Gameprog - Escola de programação de jogos digitais
Contato: gameprog.br@gmail.com
Fase 16.2
16.2 Escaneando o diretório
1.1 Visão geral
Neste tópico vamos aprender duas maneiras melhores de alistar os arquivos
do sistema.
---------------------------------------------------------------------------
dbPerformCheckListForDrives();
void dbPerformCheckListForDrives( void );
Esta função preenche uma lista com os drives do sistemas.
Exemplo:
int ncx; char *cDrive;
dbPerformCheckListForDrives();
ntam = dbChecklistQuantity();
for (ncx=1; ncx <= ntam; ncx++)
{
cDrive = dbChecklistString (ncx);
dbPrint ( cDrive;);
} // endfor
---------------------------------------------------------------------------
dbPerformCheckListForFiles()
void dbPerformCheckListForFiles( void );
Esta função preenche uma lista com os arquivos do diretório corrente.
Exemplo:
int ncx; char *cArquivo;
// Vamos mostrar os arquivos da pasta c:\Gameprog
dbCD("c:\\Gameprog");
dbPerformCheckListForFiles();
ntam = dbChecklistQuantity();
for (ncx=1; ncx <= ntam; ncx++)
{
cArquivo = dbChecklistString (ncx);
dbPrint( cArquivo);
} // endfor
No tópico anterior (16.1) apenas visualizamos os arquivos. Com a abordagem
mostrada neste tópico temos acesso a uma lista de arquivos à qual podemos
submeter depois a algum outro processo posterior.
Veja agora o programa exemplo desse tópico:

// scandir.cpp
// Este programa testa funções de sistema de arquivos da linha dbPerform...
#include "DarkGDK.h"
// Protótipo das funções
void initsys(); // inicializa o sistema
void avisar(char *cText); // Exibe um aviso
void scan_dir(); // Testa funções de sistema de arquivos
// ----------------------------------------------------------------------------
void DarkGDK ( void ) {
// Começo da aplicação DarkGdk
initsys();
scan_dir();
// Looping principal
while ( LoopGDK ( ) ) {
dbSync ( );
} // fim do while
return;
} // endfunction DarkGDK()
// ----------------------------------------------------------------------------
void initsys() {
// Esta função inicializa o sistema
dbSyncOn( );
dbSetDisplayMode (800,600,32);
dbSetWindowSize(800,600);
dbCLS ( dbRGB(0,0,255));
dbInk( dbRGB(255,255,255), dbRGB(0,0,255) );
dbSetWindowTitle("scandir.cpp"); dbSetTextOpaque();
} // initsys().fim
// ----------------------------------------------------------------------------
void avisar(char * cText) {
dbPrint(" ");
dbPrint(cText);
dbPrint("-------------------------------------------------------------------");
} // endfunction avisar()
void scan_dir() {
int ntam, ncx;
char *cArquivo;
char *cDrive;
char sinfo[255];
// Vamos mostrar a lista de drives do sistema
avisar(" dbPerformCheckListForDrives()");
dbPerformCheckListForDrives();
ntam = dbChecklistQuantity();
for (ncx=1; ncx <= ntam; ncx++)
{
cDrive = dbChecklistString (ncx);
sprintf(sinfo, " Drive: %s", cDrive);
dbPrint ( sinfo);
} // endfor
// Vamos mostrar os arquivos da pasta c:\Gameprog
avisar(" dbPerformCheckListForFiles()");
dbCD("c:\\Gameprog");
dbPerformCheckListForFiles();
ntam = dbChecklistQuantity();
for (ncx=1; ncx <= ntam; ncx++)
{
cArquivo = dbChecklistString (ncx);
sprintf(sinfo, " %d %s", ncx, cArquivo);
dbPrint( sinfo);
} // endfor
} // endfunction scan_dir()
1.2 Escaneando o diretório passo a passo
Vamos ver agora a maneira mais eficiente de acessar os arquivos do diretório.
A DarkGdk apresenta funções que permitem acessar recursivamente cada arquivo
do diretório e que permitem acessar outras informações do arquivo como
tamanho, data de criação e modificação.
As funções que serão estudadas nesta seção são:
dbFindFirst() dbFindNext()
dbGetFileName() dbGetFileType() dbFileSize()
dbGetFileCreation() dbGetFileDate();
Estas funções são usadas necessariamente em conjunto.
dbFindFirst(); dbFindNext();
void dbFindFirst( void ); void dbFindNext( void );
dbFindFirst() inicia o processo de verificação dos arquivos localizando a
primeira ocorrência no diretório. Estas duas primeiras funções localizam
pastas e arquivos. Depois do uso destas funções você deve usar as outras
funções para investigar os resultados obtidos. Na sequência você deve usar
dbGetFileType() para determinar se a ocorrência localizada é um arquivo ou
uma pasta.
dbFindNext() continua processo de verificação dos arquivos localizando a
cada rodada a próxima ocorrência no diretório.
ntipo = dbGetFileType();
int dbGetFileType( void );
Esta função retorna o tipo da ocorrência localizada. Os valores que podem ser
retornados são estes:
0 - tipo arquivo
1 - tipo pasta
-1 - não há mais ocorrências no diretório.
cArquivo = dbGetFileName();
char* dbGetFileName( void );
Esta função retorna o nome do arquivo ou pasta conforme a ocorrência.
nsize = dbFileSize(cArquivo);
int dbFileSize ( char* pFilename );
Esta função retorna o tamanho do arquivo ou zero (0) se a ocorrência
for uma pasta.
cDtCriacao = dbGetFileCreation();
char* dbGetFileCreation( void );
Esta função retorna a data de criação da ocorrência.
cDtModificacao = dbGetFileDate();
char* dbGetFileDate( void );
Esta função retorna a data de modificação da ocorrência.
Nosso programa de exemplo mostra como usar estas funções:

// scandir02.cpp
// Este programa ilustra como escanear passo a passo os arquivos do diretório
#include "DarkGDK.h"
// Protótipo das funções
void initsys(); // inicializa o sistema
void scan_dir02(); // Testa funções de sistema de arquivos
void detalhar (int nlinha); // mostra detalhes do arquivo
// tipo de arquivo
#define tipo_arquivo 0
#define tipo_pasta 1
#define tipo_eof -1
// Elenco de cores
int nAzul = 0x000080; int nBranco = 0xFFFFFF;
int nVermelho = 0x800000; int nVerde = 0x008000;
// ----------------------------------------------------------------------------
void DarkGDK ( void ) {
// Começo da aplicação DarkGdk
initsys();
scan_dir02();
// Looping principal
while ( LoopGDK ( ) ) {
dbSync ( );
} // fim do while
return;
} // endfunction DarkGDK()
// ----------------------------------------------------------------------------
void initsys() {
// Esta função inicializa o sistema
dbSyncOn( );
dbSetDisplayMode (800,600,32); dbSetWindowSize(800,600);
dbCLS ( nBranco); dbInk( nAzul, nBranco );
dbSetWindowTitle("scandir02.cpp"); dbSetTextOpaque();
} // initsys().fim
// ----------------------------------------------------------------------------
void scan_dir02() {
int ntipo, ncx, nlinha;
// Legenda dos dados de arquivo
dbText (10, 10, "Arquivo");
dbText (180, 10, "Tamanho");
dbText(300, 10, "cDtCriacao");
dbText(540,10, "cDtModificacao");
// Inicia o processo de escaneamento do diretório
dbCD("c:\\Gameprog");
dbFindFirst();
ntipo = dbGetFileType();
detalhar(40);
nlinha = 60;
if (ntipo == tipo_eof) return;
// Continua o processo de escaneamento do diretório
for (ncx=0; ncx <= 30; ncx++)
{
dbFindNext();
ntipo = dbGetFileType();
if (ntipo == tipo_arquivo || ntipo == tipo_pasta)
{
detalhar( nlinha);
} // endif
if (ntipo == tipo_eof) break;
dbSync();
nlinha = nlinha + 20;
} // endfor
} // endfunction scan_dir()
// ----------------------------------------------------------------------------
void detalhar(int nlinha) {
// Esta funções obtém e mostra detalhes do arquivo
long nsize = 0;
int ntipo = 0;
char *cArquivo, *cDtCriacao, *cDtModificacao;
char sinfo[255];
// Obtém detalhes do arquivo
cArquivo = dbGetFileName();
ntipo = dbGetFileType();
nsize = dbFileSize(cArquivo);
cDtCriacao = dbGetFileCreation();
cDtModificacao = dbGetFileDate();
// Mostra o nome da pasta ou arquivo
dbInk( 0, nBranco);
if (ntipo == tipo_pasta){
sprintf(sinfo,"[%s%]",cArquivo);
dbText (10, nlinha, sinfo);
} // endif
else {
dbText (10, nlinha, cArquivo);
} // end else
// Mostra tamanho
dbInk( nVermelho, nBranco);
sprintf(sinfo, "[%li]", nsize);
dbText (180, nlinha, sinfo);
// Mostra data de criação
dbInk( nAzul, nBranco);
dbText(300, nlinha, cDtCriacao);
// Mostra data de modificação
dbInk( nVermelho, nBranco);
dbText(540, nlinha, cDtModificacao);
} // endfunction detalhar()