Hola, tienes que usar recursividad. Copiate el código de esta función. Esta función tiene más funcionalidades pero las he quitado (ya que no vienen al caso que tu pretendes). Espero no haber borrado demasiado y que no funcione.
Function _RecorrerDir
* Recorre la estructura de directorios que se le indique (incluidos los subdirectorios) y los almacena en un vector.
* Parametros:
* m.sRuta=La ruta desde la cual se quiere empezar a recorrer la estructura.
* m.sTiposArch=Una cadena con las extensiones de los archivos que se quieren procesar.
* Devuelve: Un vector con la estructura de directorios, subdirectorios y los ficheros que se quieren procesar.
* Por ahora el vector es publico.
Lparameters m.sRuta,m.sTiposArch
* Almacena los sucesivos directorios que se van obteniendo recursivamente.
Local array m.aMatriz[1]
* Contadores.
Local i,n
* Cargar los directorios de la ruta seleccionada en una matriz.
n=ADir(m.aMatriz,m.sRuta+"\*.*","D")
* Recorremos los directorios.
For i=1 to n
* Descartamos los directorios padre (..) y el mismo (.).
If m.aMatriz[i,1] != "." and m.aMatriz[i,1] != ".."
* Comprobar si el fichero obtenido se incluye en la copia según configuración.
If InList(JustExt(m.aMatriz[i,1]),&sTiposArch.)
* Si es el primer fichero (primer elemento del vector logico).
If Vartype(aEstrucDirArch[1])="L"
* La matriz publica.
aEstrucDirArch[1]=m.sRuta+"\"+m.aMatriz[i,1]
Else
* Redimensionamos y guardamos el directorio obtenido en el vector publico.
Dimension aEstrucDirArch[Alen(aEstrucDirArch,1)+1]
aEstrucDirArch[Alen(aEstrucDirArch,1)]=m.sRuta+"\"+m.aMatriz[i,1]
EndIf
* Mensaje del fichero en proceso.
Wait m.sRuta+"\"+m.aMatriz[i,1] window nowait
EndIf
* Llamada de la función a si misma (recursividad).
This._RecorrerDir(m.sRuta+"\"+m.aMatriz[i,1],m.sTiposArch,m.sNombreFormLlamada)
EndIf
EndFor
EndFunc