Avatar billede krogstrup Nybegynder
26. juli 2005 - 14:05 Der 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


osv osv...
Avatar billede softspot Forsker
26. juli 2005 - 14:23 #1
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 & "&nbsp;")
  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
Avatar billede busschou Praktikant
26. juli 2005 - 14:24 #2
<%
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

response.write ShowFolderList("dinsti")
%>
Avatar billede softspot Forsker
26. juli 2005 - 14:33 #3
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 & "&nbsp;")
  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 :)).
Avatar billede krogstrup Nybegynder
26. juli 2005 - 14:35 #4
Hej - tak til jer begge.

softspot >
Forstår godt dit argument for at have 2 funktioner, men jeg tror alligevel jeg satser på busschou´s funktion.

busschou >
Takker for den enkle løsning :-)
Avatar billede busschou Praktikant
26. juli 2005 - 14:37 #5
det var så lidt :o)
Hvis du vil have filer med er den jo lige til at udbygge
Avatar billede krogstrup Nybegynder
26. juli 2005 - 15:39 #6
præcis :-)

Ligger du tilfældigvis inde med et eksempel hvor filer medtages ?
Avatar billede busschou Praktikant
26. juli 2005 - 15:44 #7
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
Avatar billede krogstrup Nybegynder
26. juli 2005 - 15:52 #8
Tusind tak for hjælpen.

Jeg spekulerede på... I nedenstående linie:

For Each f1 in sf

er 'f1' et variabelnavn man selv bestemmer ?
Avatar billede busschou Praktikant
26. juli 2005 - 16:08 #9
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
Avatar billede Ny bruger Nybegynder

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.

Loading billede Opret Preview
Kategori
Kurser inden for grundlæggende programmering

Log ind eller opret profil

Hov!

For at kunne deltage på Computerworld Eksperten skal du være logget ind.

Det er heldigvis nemt at oprette en bruger: Det tager to minutter og du kan vælge at bruge enten e-mail, Facebook eller Google som login.

Du kan også logge ind via nedenstående tjenester