MokosMedlem sedan juni 200720 inlägg 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 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 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 Och så använder vi kod-taggarna, tack. :)
MokosMedlem sedan juni 200720 inlägg 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 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 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 Antingen skriver du call framför eller så tar du bort parenteserna.
MokosMedlem sedan juni 200720 inlägg 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