26. juli 2005 - 14:05Der er
8 kommentarer og 1 løsning
Rekursiv funktion til at liste mapper med FSO
Ligger nogen inde med et eksempel på en rekursiv funktion der tager en path som argument, og outputter hele mappestrukturen der findes "under" denne path.
Altså f.eks.
response.write listFolders("c:\")
skal outputte:
c:\ programmer program 1 program 2 program 3 document & settings windows
Jeg kunne forestille mig at det ville se nogenlunde således ud:
function listFoldersDeep(folders, indent) dim strFolderlist strFolderlist = indent & folders.parentfolder.name & "<br>" for each fldr in folders strFolderlist = strFolderlist & listFoldersDeep(fldr.subfolders, indent & " ") next listFoldersDeep = strFolderlist end function
function listFolders(path) dim fso, folders, fldr set fso = server.createobject("Scripting.FileSystemObject") set folders = fso.GetFolders("c:\") listFolders = listFoldersDeep(folders, "") end function
<% Function ShowFolderList(folderspec) Dim fso, f, f1, s, sf Set fso = CreateObject("Scripting.FileSystemObject") Set f = fso.GetFolder(folderspec) Set sf = f.SubFolders For Each f1 in sf s = s & f1.name s = s & "<BR>" s = s & ShowFolderList(f1.Path) Next ShowFolderList = s End Function
Nå, jeg kan se der var lidt bugs i min version. Den skal se således ud:
function listFoldersDeep(folder, indent) dim strFolderlist strFolderlist = indent & folder.name & "<br>" for each fldr in folder.subfolders strFolderlist = strFolderlist & listFoldersDeep(fldr, indent & " ") next listFoldersDeep = strFolderlist end function
function listFolders(path) dim fso, folders, fldr set fso = Server.CreateObject("Scripting.FileSystemObject") set folder = fso.GetFolder(path) listFolders = listFoldersDeep(folder, "") end function
response.Write listFolders("c:\temp")
Grunden til at jeg har to funktioner til at håndtere denne rekursion er at jeg gerne vil undgå at oprette fso-objektet hver gang jeg itererer (jeg har en eller anden mistanke om at det er mere resursekrævende og performer dårligere hvis man skal oprette FSO'en hver gang - men det er mest en fornemmelse :)).
nope desværre, men sådan her så tager dem dem med ---- <% Function ShowFolderList(folderspec) Dim fso, f, f1, s, sf, file Set fso = CreateObject("Scripting.FileSystemObject") Set f = fso.GetFolder(folderspec) Set sf = f.SubFolders For Each f1 in sf s = s & f1.name s = s & "<BR>" s = s & ShowFolderList(f1.Path) For Each file in f1.Files s = s & file.Name & "<br>" Next Next ShowFolderList = s End Function
response.write ShowFolderList("dinsti") %> --- Så kan du evt bikse med det så det kommer til at se ud som ønsket, altså om filer skal over mapper eller under når der er flere foldere. Eller hvis du vil have indrykning for overskuelighedens skyld
det var så lidt da :o) Ja det er det i en For Each løkke -- For Each a In b -- der bestemmer du selv "a" men den skal blot være Dim´et tidligere "b" skal der imod være sat på forhånd, og det er den i dit tilfælde ved Set sf = f.SubFolders Hvorved sf peger på en collection af foldere
Synes godt om
Ny brugerNybegynder
Din løsning...
Tilladte BB-code-tags: [b]fed[/b] [i]kursiv[/i] [u]understreget[/u] Web- og emailadresser omdannes automatisk til links. Der sættes "nofollow" på alle links.