program Pointer3; uses dos; { Segunda version: ahora construimos un arbol binario con los archivos y directorios. } type pArchivo = ^Archivo; Archivo = record Nombre: string[50]; Abajo, Derecha: pArchivo; end; var Raiz : pArchivo; Prefijo: string; function ArchivoNuevo(arch: string): pArchivo; var tArch: pArchivo; begin new(tArch); with tArch^ do begin Nombre := arch; Abajo := nil; Derecha := nil; end; ArchivoNuevo := tArch; end; function DirectorioNuevo(dir: string): pArchivo; var sr: SearchRec; Primer, tArch: pArchivo; begin Primer := nil; ChDir(dir); FindFirst('*.*', AnyFile, sr); while (DosError = 0) do begin if (sr.Attr and VolumeID) = 0 then begin { Ocultos no! } tArch := ArchivoNuevo(sr.name); tArch^.Abajo := Primer; Primer := tArch; if (Directory and sr.Attr) <> 0 then begin { Directorio } if (sr.name <> '..') and (sr.name <> '.') then begin Primer^.Derecha := DirectorioNuevo(sr.name); end; end; end; FindNext(sr); end; ChDir('..'); DirectorioNuevo := Primer; end; procedure MostrarArbol(R: pArchivo); var tArch: pArchivo; begin tArch := R; Prefijo := Prefijo + ' '; while (tArch <> nil) do begin writeln(Prefijo, tArch^.Nombre); if (tArch^.Derecha <> nil) then MostrarArbol(tArch^.Derecha); tArch := tArch^.Abajo; end; Prefijo := copy(Prefijo, 1, length(Prefijo)-3); end; begin Prefijo := ''; Raiz := DirectorioNuevo('\tmp\testdir'); MostrarArbol(Raiz); end.