Página 1 de 2
Listar pastas e subpastas
Enviado: 06 Mar 2017 18:05
por rubens
Boa tarde...
Como faço para pegar a pasta e subpastas?
Pelo que vi no Directory() basta colocar a opção "D", mas só aparece uma lista, não dá para saber se é pasta ou arquivo.
Como estou fazendo
Código: Selecionar todos
PROCEDURE Main()
cTexto := ''
aDir1 := DIRECTORY("c:\hmg\", "D")
For x = 1 to Len( aDir1 )
cTexto += aDir1[x,1] +Hb_Eol()
Next
MemoEdit( cTexto, 10,10,20,70 )
Return nil
Daí no memoedit aparece uma listagem com os nomes dos arquivos e pastas, mas quando é pasta não dá para saber como é pasta, dessa forma não sei como pegar os arquivos dentro das pastas...
Obrigado
Rubens
Listar pastas e subpastas
Enviado: 06 Mar 2017 18:18
por JoséQuintas
Veja se ajuda.
Código: Selecionar todos
#include "directry.ch"
PROCEDURE Main
LOCAL acFiles, cFileName
SetMode(25,80)
CLS
acFiles := {}
ListFiles( "C:\", acFiles )
FOR EACH cFileName IN acFiles
? cFileName
NEXT
RETURN
FUNCTION ListFiles( cPath, acFiles )
LOCAL oDirList, oFile
oDirList := Directory( cPath + "*.*", "D" )
FOR EACH oFile IN oDirList
DO CASE
CASE oFile[ F_NAME ] == "." .OR. oFile[ F_NAME ] == ".."
CASE oFile[ F_ATTR ] == "D"
ListFiles( cPath + oFile[ F_NAME ] + "\", acFiles )
OTHERWISE
AAdd( acFiles, cPath + oFile[ F_NAME ] )
ENDCASE
NEXT
RETURN NIL
Listar pastas e subpastas
Enviado: 06 Mar 2017 22:39
por rossine
Olá Rubens,
Veja se este exemplo te ajuda:
Código: Selecionar todos
function main
local aDirec
cls
? "Listando os arquivos. Aguarde..."
aDirec := MyDirectoryRecurse( ".\*.prg", "A" )
hb_memowrit( "listdir.log", FormatDirStr( aDirec, .F. ) )
? "Veja o arquivo LISTDIR.LOG"
return NIL
***************************
function MyDirectoryRecurse( cMascara, cAtributo )
***************************
local cPath := "", cMask := "", cExt := "", aFiles := {}
hb_FNameSplit( cMascara, @cPath, @cMask, @cExt )
//busca da 1a pasta (find first folder)
aEval( Directory( cMascara, cAtributo ), { |x|
if !x[1] == "OS"
x[1] := cPath + x[1]
aadd( aFiles, x )
endif
} )
//? "-------------"
//? "path=" + cPath + " cMask=" + cMask + " cExt=" + cExt
//pega todos os arquivos e diretorios (find all files and folders)
aEval( Directory( cPath + hb_ps() + "*.*", "D" ), ;
{ |x|
local cNewPath
if x[5] = "D" .and. !x[1] == "." .and. !x[1] == ".."
// qout( "[" + cPath + "-" + x[1] + "-" + hb_ps() + cMascara + "]" )
cNewPath := cPath + x[1] + hb_ps() + cMask + cExt // cMascara // cMask
// ? cNewPath
aEval( MyDirectoryRecurse( cNewPath, cAtributo ),{ |x| aadd( aFiles, x ) } )
endif
} )
return aFiles
*********************
function FormatDirStr( aDirec, lOrd ) // 30/11/16
*********************
local cDirec
__DefaultNIL( @lOrd, .F. )
if lOrd
aDirec := asort( aDirec,,,{ |x,y| (dtos(x[3]) + x[4]) < (dtos(y[3]) + y[4]) } )
endif
cDirec := strtran( hb_valtoexp( aDirec ), "}, {", "}," + chr(13) + chr(10) + "{" )
cDirec := strtran( cDirec, ".\", "" )
return cDirec
T+
Listar pastas e subpastas
Enviado: 06 Mar 2017 22:43
por rubens
Quintas...
Blz... funcionou... sim...
Só um detalhe... se eu uso *.* lista as pastas...
Se uso uma máscara lista só os arquivos da pasta atual. Tipo *.dbf lista só da pasta atual das subpastas não lista...
O que precisa mudar para listar os dbf da pasta atual e das subpastas...?
Obrigado
Rubens
Listar pastas e subpastas
Enviado: 06 Mar 2017 23:02
por JoséQuintas
Código: Selecionar todos
CASE Upper( Right( oFile[ F_NAME ], 4 ) ) == ".DBF"
AAdd( acFiles, cPath + oFile[ F_NAME ] )
ENDCASE
Listar pastas e subpastas
Enviado: 07 Mar 2017 00:17
por Claudio Soto
Aquí hay un ejemplo en HMG oficial de como crear el árbol de directorios de un disco y como ir mostrando en un Grid los archivos de las diferentes carpetas.
http://pctoledo.com.br/forum/viewtopic.php?f=45&t=15418
PD: en los demos del control Tree de HMG oficial hay un ejemplo más sencillo de como escanear un disco y formar el árbol de directorios, pero este demo es mucho más lento que el ejemplo del link anterior, porque este último utiliza directo funciones en C de la lib Bos Taurus y no funciones de HB para escanear las carpetas y los archivos.
Listar pastas e subpastas
Enviado: 07 Mar 2017 08:23
por Toledo
rubens escreveu:para listar os dbf da pasta atual e das subpastas...?
Amigos, vejam também a função DirectoryRecurse() da xhb.lib:
Código: Selecionar todos
// The example collects file in formation about DBF files in the
// current directory and its sub-directories, and writes the result
// to a file.
PROCEDURE Main
LOCAL aFiles
SET ALTERNATE TO PrgFiles.txt
SET ALTERNATE ON
aFiles := DirectoryRecurse( "*.dbf" )
AEval( aFiles, {|a| QOut( ValToPrg( a ) ) } )
SET ALTERNATE OFF
SET ALTERNATE TO
RETURN
Abraços,
Listar pastas e subpastas
Enviado: 07 Mar 2017 20:52
por fladimir
Um pequeno detalhe no exemplo do colega Quintas, faltou passar como referencia a variável Local
acFiles para a função ListFiles()
Código: Selecionar todos
#include "directry.ch"
PROCEDURE Main
LOCAL acFiles, cFileName
SetMode(25,80)
CLS
acFiles := {}
ListFiles( "C:\", @acFiles ) //---------------------> Passar com @ (referencia) devido variavel ser local
FOR EACH cFileName IN acFiles
? cFileName
NEXT
RETURN
Listar pastas e subpastas
Enviado: 07 Mar 2017 20:54
por Pablo César
Muito bom.
Obrigado por compartilhar amigo Toledo.
Listar pastas e subpastas
Enviado: 07 Mar 2017 21:32
por JoséQuintas
faltou passar como referencia a variável Local acFiles
Array é sempre passado por referência.
De qualquer forma, é bom lembrar desse detalhe.
Neste caso, por exemplo, já seria obrigatório passar por referência.
Código: Selecionar todos
LOCAL x
Rotina( @x )
FUNCTION Rotina( x )
x := { 1 }
RETURN NIL
Listar pastas e subpastas
Enviado: 08 Mar 2017 15:08
por rubens
Boa tarde...
Só para informar os testes...
A Solução do Rossine funcionou beleza...
Do Toledo com o DirectoryRecurse() da xhb.lib também funcionou inclusive vou adotar ela no sistema...
O Projeto do Dr. Claudio é muito bacana... só cheguei a ver... não estudei... é muito avançado para a necessidade do momento tendo em vista que surgiu uma solução mais simples...
Quintas mesmo colocando a sua última modificação, ainda não consegui listar as subpastas...
Retorna uma listagem como a da figura abaixo:
Não sei o que estou fazendo de errado... tentei debugar, acho que algo não está correto onde manda pegar todos os itens, mas é só especulação...
Obrigado a todos,
Rubens
Listar pastas e subpastas
Enviado: 08 Mar 2017 17:48
por JoséQuintas
Simples: veja aonde colocou *.dbf, porque isso não tem no fonte que passei.... rs
Provavelmente passou o nome da pasta como *.dbf, e não deveria.
Listar pastas e subpastas
Enviado: 10 Out 2023 09:27
por deividdjs
Amigos .. bom dia!!
eu trabalho com Harbour e GTWVT ... eu consigo dentro da minha aplicação console chamar um explorador de arquivos do windows em modo janela ?? tipo para selecionar uma imagem ou um arquivos XML que será importado para dentro do sistema ... não sei se fui bem claro !! rs ... trabalhar meio q de forma hibrida

é possivel ?? pq tentei usar este codigo e não encontro essa função no harbour e pelo que pesquisei é do HMG.. como eu poderia conseguir essa façanha ? rs
de que biblioteca é essa função GETFILE ()

alguem sabe ??
Código: Selecionar todos
*------------------------------*
PROCEDURE IMPORT_XML_DBF()
*------------------------------*
#include "directry.ch"
/*
LOCAL acFiles, cFileName
acFiles := {}
ListFiles( "\XML\", @acFiles )
FOR EACH cFileName IN acFiles
? cFileName
NEXT
RETURN
*/
arquivo=getfile({{"Arquivo XML","*.xml"},"*.xml"},"Procurar arquivos XML","XML",.f.,.t.)
xlocal="XML\"+right(arquivo,len(arquivo)-rat([\],arquivo))
if left(xlocal,9)#"XML\"
copy file &arquivo to &xlocal
end if
replace imagem with xlocal
Listar pastas e subpastas
Enviado: 10 Out 2023 12:54
por Itamar M. Lins Jr.
Olá!
Código: Selecionar todos
cArqXML := win_GetOpenFileName(, "Arquivo XIS MÊ LÊ", "download\", "XML", "*.XML", 1 )
Saudações,
Itamar M. Lins Jr.
Listar pastas e subpastas
Enviado: 10 Out 2023 14:46
por JoséQuintas
Como está usando essa rotina de pegar nomes de arquivos, é de se imaginar que está querendo adicionar algum algo mais no aplicativo.
Com WVG pode aproveitar sua tela console e brincar um pouco mais.
A princípio é compilar usando GTWVG.HBC.
O resto depende do que fizer.
Só importante lembrar que a rotina de erro padrão é pra console, e gtwvg não é console.