webForumDet fria alternativet

Lista Folders och subfolder

8 svar · 530 visningar · startad av Mokos

MokosMedlem sedan juni 200720 inlägg
#1

hej.
jag behöver hjälp med att lista alla mappar i en mapp, och att sedan lista alla undermappar till respektive mapp...

sidan skall inte laddas om utan skrivs till en xml fil som skriver ut det i formatet:
<node text="mapp1">
<node text="undermappmapp11" />
<node text="undermappmapp12" />
<node text="undermappmapp13" />
</node>
<node text="mapp2">
<node text="undermappmapp21" />
<node text="undermappmapp22" />
<node text="undermappmapp23" />
</node>

som det är nu så kan jag få mapparna att skrivas ut en nivå ner...
men om "undermappmapp12" har en undermapp under sig, så skall den också skrivas ut..
detta kan ju göras genom att jag skapar en massa
<%for each Folder1 in Folder... %> och skapa en hel massa såna..
men det känns inte riktigt optimalt... :(

jag har förstått att man kan göra en funktion som anropar sig själv om det finns undermappar... men jag har inte riktigt fått detta att funka..

mvh
Christian

colioneMedlem sedan juni 20014 421 inlägg
#2
Set FSO = Server.CreateObject("Scripting.FileSystemObject") 
Set fldFolder = FSO.GetFolder("C:\mapp\")

Sub RecurseFolders(myFolder)
	
	For each fldSub in myFolder.SubFolders
		RecurseFolders fldSub
	Next

end Sub

RecurseFolders fldFolder

Där har du en början. :)

MokosMedlem sedan juni 200720 inlägg
#3

ok..
här är hela koden

<%
BaseFolder="../../../Files/Pages"'i vilken mapp ligger bilderna??
path = server.mappath(BaseFolder)'Sätt file sökvägen dvs. d:\wwwroot....
'******** Filesystem Objektet*******************
Dim fs,fo
Set fs=Server.CreateObject("Scripting.FileSystemObject")
Set fo=fs.GetFolder(path)
Set sfo = fo.SubFolders

' Name for the ouput document 
file_being_created= "pages.xml"

' create a file system object
set fso = createobject("scripting.filesystemobject")

' create the text file - true will overwrite any previous files
' Writes the db output to a .xml file in the same directory 
Set act = fso.CreateTextFile(server.mappath(file_being_created), true)

' All non repetitive xml on top goes here
act.WriteLine("<?xml version=""1.0""?>")
act.WriteLine("<nodes>")

'Loop to output all the query results to the xml document
	For Each Folder in sfo
	act.WriteLine("<node text="""&Folder.name&""">")
	call SubFolderlist(Folder)
	act.WriteLine("</node>")
	Next
' All non repetitive xml on bottom goes here
act.WriteLine("</nodes>")

' close the object (xml)
act.close

Function SubFolderlist(sFolder)
			For Each NewFolder in sFolder.subfolders
			act.WriteLine("<node text="""&sFolder.name&""">")
			call SubFolderlist(subfolder)
			act.WriteLine("</node>")
			Next
end function
%>

problemet ligger i när jag skall lista undermapparna på en undermapp...
funktionen är inte implementerad, jag tog med den för att visa lite hur jag tror att jag tänkt... :r

OveRRidEMedlem sedan feb. 200112 078 inlägg
#4

Och så använder vi kod-taggarna, tack. :)

MokosMedlem sedan juni 200720 inlägg
#5

Lösning!

Tja... här händer det ju inte mycket.. :OO

Jag löste det själv istället.. för alla er som undrar hur jag gjorde så är lösningen här

<%
BaseFolder="../../../Files/Pages"'i vilken mapp ligger bilderna??
path = server.mappath(BaseFolder)'Sätt file sökvägen dvs. d:\wwwroot....

'******** Filesystem Objektet*******************
Dim fs,fo
Set fs=Server.CreateObject("Scripting.FileSystemObject")
Set fo=fs.GetFolder(path)
Set fc = fo.SubFolders 'create foldercollection

' create a file system object
set fso = createobject("scripting.filesystemobject")

' create the text file - true will overwrite any previous files
Set act = fso.CreateTextFile(server.mappath("pages.xml"), true)

' All non repetitive xml on top goes here
act.WriteLine("<?xml version=""1.0""?>")
act.WriteLine("<nodes>")

'Loop to output all the fso results to the xml document
	For Each Folder in fc
	act.WriteLine("<node text="""&Folder.name&""">")
        List(fo & "\" & Folder.Name)	
	act.WriteLine("</node>")
	Next
' All non repetitive xml on bottom goes here
act.WriteLine("</nodes>")

' close the object (xml)
act.close

Function List(StartingPoint)

    Set FSO = Server.CreateObject("Scripting.FileSystemObject")
    
    Set CurrentDir = FSO.GetFolder(StartingPoint)
    Set DirsFound = CurrentDir.SubFolders

    For Each Dir In DirsFound
    
        act.WriteLine("<node text="""&Dir.name&""">")
        List(CurrentDir & "\" & Dir.Name)
		act.WriteLine("</node>")
    
    Next

    Set Dirs = Nothing  
    Set CurrentDir = Nothing    
    Set FSO = Nothing
    
End Function
%>

man måste skapa en funktion inne i loopen som letar efter subfolders, som refererar till den plats man står i...

tja.. hoppas det här hjälper någon

emissionMedlem sedan dec. 19996 721 inlägg
#6

Liten uppstädning:

-Du behöver inte skapa flera FileSystemObject
-Du behöver inte ha en startloop och en loop i List-metoden
-Det ska vara en Sub, inte en Function, eftersom inget returneras
-Text-skrivaren skickas in i List-metoden, eftersom det är mer återanvändbart än när den jobbar mot en yttre variabel.

<%
BaseFolder="../../../Files/Pages"'i vilken mapp ligger bilderna??
path = server.mappath(BaseFolder)'Sätt file sökvägen dvs. d:\wwwroot....

'******** Filesystem Objektet*******************
Dim fs,fo
Set fs=Server.CreateObject("Scripting.FileSystemObject")
Set fo=fs.GetFolder(path)

' create the text file - true will overwrite any previous files
Set act = fs.CreateTextFile(server.mappath("pages.xml"), true)

' All non repetitive xml on top goes here
act.WriteLine("<?xml version=""1.0""?>")
act.WriteLine("<nodes>")

List(act,fo)

act.WriteLine("</nodes>")

' close the object (xml)
act.close

Function List(theTextFile, theFolder)

    

    For Each Dir In theFolder.Subfolders
    
        theTextFile.WriteLine("<node text="""&Dir.name&""">")
        List(theTextFile,Dir)
	theTextFile.WriteLine("</node>")
    
    Next

   
    
End Function
%>

Skulle också rekommendera att du använder MSXML för att generera XML-filen, annars blir det svårt att generera giltig XML i alla lägen.

MokosMedlem sedan juni 200720 inlägg
#7

hej Emission..
jag tycker det är kul när man lägger ner tid på att optimera kod, enda negativa med ovanståeende kod är att den inte fungerar.. alls..

jag har bytt ut mot en sub, men behållt FSO m.m, eftersom detta funkar alldeles utmärkt..

felmeddelandet kommer här:
List(act,fo)
---------^
och den klagar på att man inte kan använda paranteser för att anropa en sub?

regards
Christian

colioneMedlem sedan juni 20014 421 inlägg
#8

Antingen skriver du call framför eller så tar du bort parenteserna.

MokosMedlem sedan juni 200720 inlägg
#9

ok tack colione...
nu funkar det med koden som emission bidrog med..
visste inte att det var sådan skillnad när man anropar en sub med call eller inte..

/tack
Christian

129 ms totalt · 3 externa anrop · v20260731065814-full.30151723
0 ms — hämta forumlista (cache)
0 ms — hämta statistik (cache)
126 ms — hämta tråd, inlägg och bilagor (db)