SAMPLE: How to List Directories on Entire Drive

Last reviewed: January 20, 1996
Article ID: Q139964
The information in this article applies to:
  • Microsoft Visual FoxPro for Windows, version 3.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 reference words: 3.00 VFoxWin ocx
KBCategory: kbprg kbcode kbhowto
KBSubcategory: FxprgClassoop


THE INFORMATION PROVIDED IN THE MICROSOFT KNOWLEDGE BASE IS PROVIDED "AS IS" WITHOUT WARRANTY OF ANY KIND. MICROSOFT DISCLAIMS ALL WARRANTIES, EITHER EXPRESS OR IMPLIED, INCLUDING THE WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE. IN NO EVENT SHALL MICROSOFT CORPORATION OR ITS SUPPLIERS BE LIABLE FOR ANY DAMAGES WHATSOEVER INCLUDING DIRECT, INDIRECT, INCIDENTAL, CONSEQUENTIAL, LOSS OF BUSINESS PROFITS OR SPECIAL DAMAGES, EVEN IF MICROSOFT CORPORATION OR ITS SUPPLIERS HAVE BEEN ADVISED OF THE POSSIBILITY OF SUCH DAMAGES. SOME STATES DO NOT ALLOW THE EXCLUSION OR LIMITATION OF LIABILITY FOR CONSEQUENTIAL OR INCIDENTAL DAMAGES SO THE FOREGOING LIMITATION MAY NOT APPLY.

Last reviewed: January 20, 1996
© 1998 Microsoft Corporation. All rights reserved. Terms of Use.