Curso completo de DarkGdk
Gameprog - Escola de programação de jogos digitais
Contato: gameprog.br@gmail.com
Fase 16.2

index << >>



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()

index << >>


Produzido por Gameprog: Jair Pereira - Setembro/2013 © gameprog.br@gmail.com http://www.gameprog.com.br http://www.nucleoararat.com.br