*Sample call Gettree('c:\recycled',.t.) Function Gettree Lparameters tcDirectory, tlFiles Start = seconds() Create cursor crsFiles ; (FolderId i, Filename m, FileSize i, Created t, Modified t, Accessed t) Create cursor crsFolders (Folder m, FolderId i) oFS = CREATEOBJECT('Scripting.FileSystemObject') oFolder = oFS.GetFolder(tcDirectory) Insert into crsFolders ; (Folder , FolderId ) ; values ; (oFolder.Path, reccount('crsFolders')+1) If tlFiles GetFiles(oFolder, reccount('crsFolders')) Endif =_SubFolders(oFolder, tlFiles) ? seconds()-start Go top Browse Function _SubFolders Lparameters toFolder, tlFiles Local loSubFolders For each oSubFolder in toFolder.Subfolders If oSubFolder.Name # "System Volume Information" Insert into crsFolders (Folder , FolderId ) ; values (oSubFolder.Path, reccount('crsFolders')+1) If tlFiles GetFiles(oSubFolder, reccount('crsFolders')) Endif =_SubFolders(oSubFolder, tlFiles) Endif Endfor Function GetFiles Lparameters toFolder, tnId For each oFile in toFolder.Files Insert into crsFiles ; (FolderId, Filename, FileSize, Modified, Accessed , Created ) ; values ; (tnId, oFile.Name, oFile.Size, ; oFile.DateCreated, oFile.DateLastModified, oFile.DateLastAccessed) EndforYou probably would better change memo fields to char fields for indexing. Instead of 2 tables you could as well just create one table (crsFiles) including oFile.Path.