SAMPLE: How to List Directories on Entire Drive

ID: Q139964


The information in this article applies to:
  • Microsoft Visual FoxPro for Windows, versions 3.0, 6.0


SUMMARY

This article provides a sample program that builds a directory listing by using the outline control. It displays directory names and directory sizes in hierarchical order.


MORE INFORMATION

This program creates a form that contains an outline control. You can copy and paste the following code into a program (.prg file) to run it. The following methods are essential to the program.

The Fillit Method

This method of the form builds the root of the directory tree. It also calls the Fill method.

The Fill Method

This method fills the directory tree with directory names and sizes. It accepts the directory name as a parameter and uses the ADIR() function to place directory information into an array. This method is first executed for the root. A recursive call to the Fill method is then executed for each level of subdirectory. The tree is complete when all of the elements of the array have been processed.

The Recalc Method

The directory listing displays the name and the size of each directory. When an item is expanded and its subordinates become visible, the Recalc method subtracts the size of each sub-directory from the size of the parent directory.

Sample Program


*:*************************************************************************
*:
*: Procedure File C:\VFP\TESTOLE.PRG
*:
*: Documented using Visual FoxPro Formatting wizard version  .03
*:*************************************************************************
*:   TESTOLE
CLEAR
PUBLIC ocDir
ocDir = CREATEOBJECT("CDir")
ocDir.Show
ocDir.Fillit("c:\")

DEFINE CLASS CDir AS FORM
   Caption = "Directories"
   Height = 2* SYSMETRIC(2) / 3
   nLevel = 0
   ADD OBJECT cmdQuit AS COMMANDBUTTON WITH ;
      CAPTION = "Quit",;
      CANCEL = .T.
   ADD OBJECT ole1 AS COutline
   PROCEDURE INIT
      THIS.ole1.Width = THIS.Width
      * Dimensions the outline to the size of the form
      THIS.ole1.Height = THIS.Height - THIS.ole1.Top

   PROCEDURE Fillit(cRoot)    && Builds the start of the directory tree
      LOCAL Totsize
      IF RIGHT(cRoot,1) # '\'
        cRoot = cRoot + '\'
      ENDIF
      THIS.ole1.Visible = .F.
      THIS.ole1.AddItem(cRoot)    && Adds the root to the outline control
      THIS.ole1.Indent[0] = 0
      * Defines the root to the outline control
      TotSize = THIS.Fill(cRoot)  && Method that fills the tree
      THIS.ole1.List[0] = THIS.ole1.LIST[0] + ' : ' +  ;
         LTRIM(TRANSFORM(Totsize,"999,999,999"))
      THIS.ole1.Itemdata[0] = TotSize
      THIS.ole1.Visible = .T. && Displays the control

   PROCEDURE FILL(cRoot) && Fills the directory tree
      LOCAL nNumbofFiles,I, acDirAll[1,1],nCumSize,nSize,nCount,Here
      nCumSize = 0
      nSize = 0
      THIS.nLevel = THIS.nLevel + 1
      * Places information into an array
      nNumbofFiles = ADIR(acDirAll,cRoot + "*.*","D")
      =ASORT(acDirAll)
      FOR I = 1 TO nNumbofFiles
         IF "D" $ acDirAll[i,5]   && Finds all the directories
            IF LEFT(acDirAll[i,1],1) != '.'
               THIS.ole1.ADDITEM(LOWER(acDirAll[i,1]))
               Here = THIS.ole1.LISTCOUNT - 1
               THIS.ole1.Indent[Here] = THIS.nLevel &&Indents the directory
               nSize = THIS.FILL(cRoot + acDirAll[i,1] + '\')
               * Fills the directory
               THIS.ole1.LIST[Here] = THIS.ole1.LIST[Here] + ' : ' +;
                  LTRIM(TRANSFORM(nSize,"999,999,999"))
               THIS.ole1.ITEMDATA[Here] = nSize
               nCumSize = nCumSize + nSize
            ENDIF
         ENDIF
         IF THIS.nLevel = 1
            THIS.ole1.nRootSize = THIS.ole1.nRootSize + acDirAll[i,2]
         ENDIF
         nCumSize = nCumSize + acDirAll[i,2]
      ENDFOR
      THIS.nLevel = THIS.nLevel - 1
      RETURN nCumSize

   PROCEDURE cmdQuit.CLICK &&Quit method for the Command Button
      THISFORM.RELEASE
      RELEASE WINDOW TRACE
      RELEASE WINDOW DEBUG
ENDDEFINE

DEFINE CLASS COutline AS OLECONTROL
   OleClass = "MSOutl.Outline"
   Top = 20
   nRootSize = 0

   PROCEDURE ReCalc(nList) && Adjusts the size of the directory
      LOCAL N,MyLevel,nSize,j,cDirName,nStart,nstartlev
      nStart = nList
      nStartlev = THIS.Indent[nList]
      MyLevel = THIS.Indent[nList]
      nSize = THIS.ITEMDATA[nlist]
      j = nList + 1
      DO WHILE j < THIS.LISTCOUNT AND THIS.Indent[j] > MyLevel
         IF THIS.IsItemVisible[j]
            nSize = nSize - THIS.ITEMDATA[j]
         ENDIF
         j = j + 1
      ENDDO
      cDirName = THIS.LIST[nlist]
      IF  VAL(STRTRAN(SUBSTR(cDirName,AT(':',cDirName)+2),",")) # nSize
         THIS.LIST[nList] = ;
            LEFT(THIS.LIST[nList],AT(':',THIS.LIST[nList])) + ' ' +;
            LTRIM(TRANSFORM(nSize,"999,999,999"))
      ENDIF
      nList = nStart
      DO WHILE .T.
         nList = nList + 1
         IF nList = THIS.ListCount OR THIS.Indent[nList] <= nStartlev
            EXIT
         ELSE
            THIS.Recalc(nList)
         ENDIF
      ENDDO

   PROCEDURE Expand(nList)
      THIS.Object.MousePointer = 11
      THIS.PictureType[nList] = 1
      THIS.Recalc(nList)
      * Recalculates the size of each directory when the item is clicked
      THIS.Object.MousePointer = 0

   PROCEDURE Collapse(nList) && Collapses an element
      LOCAL nSize
      THIS.Object.MousePointer = 11
      THIS.PictureType[nList] = 0
      cDirName = THIS.List[nlist]
      nSize = THIS.ItemData[nList]
      IF  VAL(STRTRAN(SUBSTR(cDirName,AT(':',cDirName)+2),",")) # nSize
         THIS.List[nList] =  ;
         LEFT(THIS.LIST[nList],AT(':',THIS.LIST[nList])) + ' ' +;
            LTRIM(TRANSFORM(nSize,"999,999,999"))
      ENDIF
      ni=nList+1
      DO WHILE THIS.Indent(ni)>THIS.Indent(nList)
      * Closes the folder when it is collapsed
         IF THIS.PictureType(ni)=1
           THIS.PictureType(ni)=0  &&Folder looks closed
         ENDIF
         ni=ni+1
      ENDDO
      THIS.OBJECT.MOUSEPOINTER = 0
ENDDEFINE 


REFERENCES

For more information about the outline control, search for "Outline Control" in the Visual FoxPro Help file.

Additional query words: VFoxWin ocx

Keywords : kbcode kbfile kbVFp600 FxprgClassoop
Version : 3.00
Platform : WINDOWS
Issue type :


Last Reviewed: August 16, 1999
© 2000 Microsoft Corporation. All rights reserved. Terms of Use.