Recursive Directory Listing

Cecil

19+ years progress programming and still learning.
Ages ago I wrote a Directory Listing code which will output to a Temp Table with the added benefit of recursive through the directory. However I've now lost that code so I started to rewrite it from scratch but it's failing miserably and i can't remember how it worked.

Does anybody have an code with will create temp-table records of a recursive directory listing.
 

Rob Fitzpatrick

ProgressTalk.com Sponsor
I might have a copy of your code kicking around, if it's the program I'm thinking of; I'll take a look. And presumably I downloaded it from here. Have you searched the site?
 

Cecil

19+ years progress programming and still learning.
I found this, but it's not what I'm looking for.

Code:
DEFINE VARIABLE vDirectory AS CHARACTER NO-UNDO.
DEFINE VARIABLE vDirectories AS CHARACTER LABEL "Directories" NO-UNDO.
DEFINE VARIABLE vDirSeparator AS CHARACTER NO-UNDO.
DEFINE FRAME fDir
    vDirectories AT ROW 2 COL 4
    VIEW-AS SELECTION-LIST SINGLE SCROLLBAR-VERTICAL SIZE 34 BY 8
    WITH SIDE-LABELS THREE-D VIEW-AS DIALOG-BOX CENTERED SIZE 55 BY 11
    TITLE "Directories".
ON RETURN OF vDirectories IN FRAME fDir DO:
   ASSIGN FILE-INFO:FILENAME = vDirectory + vDirSeparator + SELF:SCREEN-VALUE
   vDirectory = FILE-INFO:PATHNAME.
   RUN list_directories.
END.
vDirectory = SESSION:TEMP-DIRECTORY.
IF OPSYS = "UNIX" THEN vDirSeparator = CHR(47).
ELSE vDirSeparator = CHR(92).
RUN list_directories.
VIEW FRAME fDir.
ENABLE ALL WITH FRAME fDir.
WAIT-FOR GO, END-ERROR, WINDOW-CLOSE OF FRAME fDir.
ASSIGN FILE-INFO:FILENAME = vDirectory + vDirSeparator + vDirectories:SCREEN-VALUE
                            vDirectory = FILE-INFO:PATHNAME.
                           
MESSAGE "Directory selected =" vDirectory VIEW-AS ALERT-BOX INFORMATION.
PROCEDURE list_directories:
   DEFINE VARIABLE vDirName AS CHARACTER NO-UNDO.
   DEFINE VARIABLE vFiles AS CHARACTER EXTENT 3 NO-UNDO.
   DEFINE VARIABLE vFilesList AS CHARACTER NO-UNDO.
   INPUT FROM OS-DIR(vDirectory).
   REPEAT:
      IMPORT vFiles.
      IF INDEX(vFiles[3], "D") > 0 AND vFiles[1] <> "." THEN
         vFilesList = vFilesList + (IF vFilesList <> "" THEN "," ELSE "") + vFiles[1].
   END.
   INPUT CLOSE.
   DO WITH FRAME fDir:
      ASSIGN vDirectories:LIST-ITEMS IN FRAME fDir = vFilesList
             vDirectories:SCREEN-VALUE = ENTRY(1,vDirectories:LIST-ITEMS).
      APPLY "ENTRY" TO vDirectories.
   END.
END PROCEDURE.
 

Cecil

19+ years progress programming and still learning.
The code I had worked in batch mode so It was not interactive.
 

Osborne

Active Member
I also have a bit of a .NET solution that may be of use:
Code:
DEFINE VARIABLE vDirectory AS CHARACTER NO-UNDO.

vDirectory = "C:\Temp".
RUN ReadFiles(vDirectory).
RUN ReadSubDirectories(vDirectory).

PROCEDURE ReadFiles:
   DEFINE INPUT PARAMETER pDirectory AS CHARACTER NO-UNDO.

   DEFINE VARIABLE vCount AS INTEGER NO-UNDO.
   DEFINE VARIABLE dirFiles AS CHARACTER EXTENT NO-UNDO.

   dirFiles = System.IO.Directory:GetFiles(pDirectory).
   DO vCount = 1 TO EXTENT(dirFiles):
      ...
   END.
END PROCEDURE.

PROCEDURE ReadSubDirectories:
   DEFINE INPUT PARAMETER pDirectory AS CHARACTER NO-UNDO.

   DEFINE VARIABLE vCount AS INTEGER NO-UNDO.
   DEFINE VARIABLE vDirectories AS CHARACTER EXTENT NO-UNDO.

   vDirectories = System.IO.Directory:GetDirectories(pDirectory).
   DO vCount = 1 TO EXTENT(vDirectories):
      RUN ReadFiles(vDirectories[vCount]).
      RUN ReadSubDirectories(vDirectories[vCount]).
   END.
END PROCEDURE.
 
Last edited:
I'm not sure if you solve it but here is a method I wrote. Works good in Linux for my needs.

Rod

Code:
    METHOD PUBLIC VOID GetDirList  (INPUT cSourceDir AS CHAR,
                                    INPUT cMask      AS CHAR,
                                    INPUT lForward   AS LOG):

      DEF VAR lchrFile          AS CHAR NO-UNDO FORMAT "x(50)".
      DEF VAR lchrAttr          AS CHAR NO-UNDO FORMAT "x(5)".
      DEF VAR cFileMask         AS CHAR NO-UNDO.
      DEF VAR CFileExtentFilter AS CHAR NO-UNDO.

      cFileMask = SUBSTRING(cMask,1,INDEX(cMask,".") - 1 ).
      IF INDEX(cMask,".") > 0 THEN CFileExtentFilter  = SUBSTRING(cMask,INDEX(cMask,".") + 1,LENGTH(cMask)).

      IF TRIM(cSourceDir) = "" THEN cSourceDir = "/fiscal/tmp".
      INPUT FROM OS-DIR(cSourceDir).
      REPEAT:
        IMPORT lchrFile ^ lchrAttr.
        IF lchrAttr = "F" THEN 
        DO:
          CFileExtent = SUBSTRING(lchrFile,(INDEX(lchrFile,".") + 1),LENGTH(lchrFile)).
          IF NOT CAN-DO(CFileExtentFilter,CFileExtent) THEN NEXT.
          IF NOT SUBSTRING(lchrFile,1,INDEX(lchrFile,".") - 1 ) MATCHES cFileMask THEN NEXT.
          FILE-INFO:FILE-NAME = SUBSTITUTE("&1/&2",cSourceDir,lchrFile).
          CREATE FileList.
          ASSIGN FileList.FilePath  = cSourceDir
                 FileList.cFileName = lchrFile
                 FileList.ModDate   = FILE-INFO:FILE-MOD-DATE.
        END.
        IF lchrAttr = "D" AND lchrFile <> "." AND lchrFile <> ".." AND lForward THEN
        GetChildListing(cSourceDir + "/" + lchrFile, CFileExtentFilter).
    END.

    INPUT CLOSE.
 
    END METHOD.

    METHOD PRIVATE VOID GetChildListing (INPUT cChildDir AS CHAR,
                                         INPUT cTypeFilter AS CHAR):

      DEF VAR cChildFile AS CHARACTER NO-UNDO FORMAT "X(256)".
      DEF VAR cChildAttr AS CHARACTER NO-UNDO FORMAT "X(256)".

      INPUT FROM OS-DIR(cChildDir).
      REPEAT:
        IMPORT cChildFile ^ cChildAttr.

        IF cChildAttr = "F" THEN
        DO:
           cFileExtent = SUBSTRING(cChildFile,(INDEX(cChildFile,".") + 1),LENGTH(cChildFile)).
           IF NOT CAN-DO(cTypeFilter,CFileExtent) THEN NEXT.
           ELSE
           DO:
                    FILE-INFO:FILE-NAME = SUBSTITUTE("&1/&2",cChildDir,cChildFile).
                    CREATE FileList.
                    ASSIGN FileList.FilePath  = cChildDir
                           FileList.cFileName = cChildFile
                           FileList.ModDate   = FILE-INFO:FILE-MOD-DATE.
           END.
        END.
        IF cChildAttr = "D" AND cChildFile <> "." AND cChildFile <> ".." THEN
           GetChildListing( cChildDir + "/" + cChildFile,cTypeFilter).
      END.
      INPUT CLOSE.
    END METHOD.
 
Top