segunda-feira, dezembro 11, 2006

PowerBuilder - Listando Arquivos de um diretório

Constantemente eu vejo desenvolvedores que necessitam listar os arquivos em um diretório especifico.Normalmente, adicionam uma ListBox a uma window e chamam o método DIRLIST para preencher a ListBox com os arquivos.O grande problema é quando não possuímos uma janela no nosso programa. Muitas vezes, o desenvolvedor adiciona uma janela apenas para conseguir utilizar o ListBox, o que é uma ótima solução.
Recentemente, juntei algumas informações na Web e criei o código abaixo, que devolve em um vetor a lista de arquivos de arquivos de uma pasta, criando o ListBox e window dinamicamente.


/*INICIO Da FUnção
Salve o Conteúdo abaixo em um arquivo com o nome f_dir_list.SRF e importe para dentro da sua library*/

global type f_dir_list from function_object
end type

forward prototypes
global function long f_dir_list (string p_diretorio, string p_filtro, integer p_tipo_arquivo, ref string p_arquivos[])
end prototypes

global function long f_dir_list (string p_diretorio, string p_filtro, integer p_tipo_arquivo, ref string p_arquivos[]);
// DESCRIÇÃO:
// * Busca os arquivos de um diretório//
// ARGUMENTOS DE ENTRADA:
// * p_diretorio : Diretorio onde será feito a pesquisa. Se está variável estiver vazia, pesquisa o diretório corrente
// * p_filtro : Filtro utilizado no diretório. Se está variável estiver vazia, lista todos os arquivos
// * p_tipo_arquivo : Tipo do arquivo, conforme lista abaixo, sendo que o Default é 0 + 2 + 4
// - 0 : Arquivos de Leitura e gravação
// - 1 : Arquivos somente leitura
// - 2 : Arquivos Ocultos
// - 4 : Arquivos do Sistema
// - 16 : Sub-Pastas
// - 32 : Arquivos modificados
// - 16384 : Drivers
// - 32768 : Todos os arquivos, exceto arquivo de leitura e gravção
// - Para recuperar a uniao de um ou mais tipos acima, some os valores.
// Por exemplo, para listar arquivos leitura e gravação, subdiretorios e drivers, use 0+16+16384 ou 16400.
// * p_arquivos : Retorna por referencia a lista de arquivos passados
//
// RETORNO:
// * 1 : Sucesso
// * -1 : Erro
// * 0 : não existe arquivos
//
// OBSERVAÇÃO:
//
// CRIADO POR :
// 29/11/2006 - Thiago Campos Pereira
// ALTERADO POR :
//
//========================================================================
//Variaveis
string vls_arquivos[]
window vlw_temp
listbox vllb_temp
int vli_items, vli_i

//Trata Parametros
If isnull(p_diretorio) then
p_diretorio = ""
else
//Verifica se existe a barra no diretorno
p_diretorio = trim(p_diretorio)
if right(p_diretorio,1) = "\" then
//Retira a barra, para fazer pesquisa de diretório
p_diretorio = mid(p_diretorio,1,len(p_diretorio) - 1)
end if

//Verifica se o diretório existe
IF not DirectoryExists(p_diretorio) then
return -1
end if

//Acrescenta barra
p_diretorio = p_diretorio + "\"
end if

if isnull(p_filtro) then p_filtro = "*.*"

if isnull(p_tipo_arquivo) then p_tipo_arquivo = 0 + 2 + 4

//Instancia Objetos
Open(vlw_temp)
vlw_temp.openUserObject( vllb_temp )

//Lista arquivosv
llb_temp.DirList( p_diretorio + p_filtro , p_tipo_arquivo )

//Passa pelos arquivos, gerando lista no array
vli_items = vllb_temp.TotalItems()
For vli_i = 1 to vli_items
vls_arquivos[ vli_i ] = vllb_temp.Text( vli_i )
Next

//Fecha instancia de objetos
vlw_temp.closeUserObject( vllb_temp )
Close( vlw_temp )
p_arquivos = vls_arquivos

return 1
end function

/*Fim da função*/

Nenhum comentário: