[ASP] Folder & Subfolders

Pagina: 1
Acties:
  • 217 views sinds 30-01-2008
  • Reageer

  • PhoneTech
  • Registratie: Mei 2000
  • Laatst online: 22-04 08:47
Ik weet niet of het een probleem is, maar ik wil graag dat alle folders en subfolders in een directory lezen:

NU heb ik wel iets gevonden maar dan kan ik maar maximaal twee niveau's uitlezen..Ik heb begrepen dat hier geen standaard functie voor is...

Nu heb ik het volgende geprogrammeerd:
code:
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
<%
Set ObjFSO = Server.CreateObject("Scripting.FileSystemObject")
Set ObjF = ObjFSO.GetFolder(imgFolder)
Set ObjFolders = ObjF.SubFolders
Set ObjFiles = ObjF.Files
%>
Zooi HTML
<%For Each Folder in ObjFolders%>
   <%=Folder.Name%><br>
   <%set ObjSF = ObjFSO.GetFolder(Folder)
   set ObjSubFolders = ObjSF.SubFolders
   for each SubFolder in ObjSubFolders%>
     &nbsp;&nbsp;<%=SubFolder.Name%><br>
   <%
   next
next%>

Kan dit ook makkelijker en efficiëter?

  • brammetje
  • Registratie: Oktober 2000
  • Laatst online: 12-01-2025
zoek eens op recursief en op directory..

je zult een hoop php-implementaties tegenkomen, maar dat moet simpel om te schrijven zijn..

succes.

  • PhoneTech
  • Registratie: Mei 2000
  • Laatst online: 22-04 08:47
Ik denk dat je daar niet mee uit te voeten kan. Aangezien het script zelf moet uitzoeken hoeveel subdirs een subdir bevat enzo. Dus ik denk dat dat niet echt de goede oplossing is :(

  • brammetje
  • Registratie: Oktober 2000
  • Laatst online: 12-01-2025
Op vrijdag 18 januari 2002 19:59 schreef PhoneTechnician het volgende:
Ik denk dat je daar niet mee uit te voeten kan. Aangezien het script zelf moet uitzoeken hoeveel subdirs een subdir bevat enzo. Dus ik denk dat dat niet echt de goede oplossing is :(
jawel hoor :)

met een recursieve functie is dit erg simpel.

  • brammetje
  • Registratie: Oktober 2000
  • Laatst online: 12-01-2025
tada:
[topic=302915/1/40]

  • PhoneTech
  • Registratie: Mei 2000
  • Laatst online: 22-04 08:47
Misschien heb je de topic title niet gelezen, maar we hebben hier met VBScript te maken en niet met PHP
code:
1
<?function newdir($file){  $tmphandle = opendir($file);    while (false !== ($file = readdir($tmphandle))) {       file_or_dir($file);    }  closedir($tmphandle);}function file_or_dir($file){    if ($file != "." && $file != "..") {    if (is_dir("$file") == 1) {       echo "Dir: <b>$file</b><br>\n";         newdir($file);    } else {      echo "File: $file<br>\n";     }    }}$handle = opendir('.');while (false !== ($file = readdir($handle))) {  file_or_dir($file);}closedir($handle);?>

Hier heb ik dus vrij weinig aan.

  • Crazy D
  • Registratie: Augustus 2000
  • Laatst online: 23:39

Crazy D

I think we should take a look.

Op vrijdag 18 januari 2002 20:23 schreef PhoneTechnician het volgende:
Misschien heb je de topic title niet gelezen, maar we hebben hier met VBScript te maken en niet met PHP
Valt mee hoor, kijk maar eens goed wat het doet, idee erachter zeg maar. Als je dat idee snapt, moet dat in VBscript makkelijk om te schrijven zijn.
Hoewel je met het filescriptingobject in 1 keer alle files hebt in die dir, dat werkt iets anders dan file openen en kijken of het een file of een folder is...
[edit]
Te snel verstuurd... het maakt niks uit, het principe werkt hetzelfde.

Exact expert nodig?


  • PhoneTech
  • Registratie: Mei 2000
  • Laatst online: 22-04 08:47
Gaat een beetje lastig denk ik. Ik denk dat ik maar een max aan de subfolders ga stellen.

Misschien heb ik niet echt goed naar de code gekeken maar ik snap dan ook vrij weinig van PHP. En de code die daar in het voorbeeld wordt vermeld, zit erg raar in elkaar en ik denk dat dat niet kan in vb.

  • brammetje
  • Registratie: Oktober 2000
  • Laatst online: 12-01-2025
Op vrijdag 18 januari 2002 20:40 schreef PhoneTechnician het volgende:
Gaat een beetje lastig denk ik. Ik denk dat ik maar een max aan de subfolders ga stellen.

Misschien heb ik niet echt goed naar de code gekeken maar ik snap dan ook vrij weinig van PHP. En de code die daar in het voorbeeld wordt vermeld, zit erg raar in elkaar en ik denk dat dat niet kan in vb.
Ik denk dat dat wel kan :P

pseudo-code:
code:
1
2
3
4
5
roep de functie aan met de dir waar je wilt beginnen.
    loop door alle files die in die dir staan.
    is de file een dir?
      zo ja, print de naam, spring in en roep de functie weer aan, nu met de naam van die dir.
      no nee, print de filenaam

al klaar :)

  • Crazy D
  • Registratie: Augustus 2000
  • Laatst online: 23:39

Crazy D

I think we should take a look.

Op vrijdag 18 januari 2002 20:40 schreef PhoneTechnician het volgende:
Misschien heb ik niet echt goed naar de code gekeken maar ik snap dan ook vrij weinig van PHP. En de code die daar in het voorbeeld wordt vermeld, zit erg raar in elkaar en ik denk dat dat niet kan in vb.
Het idee is simpel.

begin: (param: directory naam)
Lees Directory
Lees files in dir
per subdir: goto begin (met subdir als beginpunt)

Je leest dus alle files uit je beginfolder. Vervolgens loop je door alle subdirectories heen, en per subdir roep je de functie weer aan (begin) met als param die subdir.
Die begint opnieuw, leest files, per folder, etc. Als je uiteindelijk alles wat onder die 1e subdir hangt uitgelezen hebt, gaat je loopje verder met de 2e subdir. En dat gaat zo dus door netzolang tot je alles hebt gehad.


PlayR typt sneller.
Enige subtiele verschil: met het scriptingobject hoef je niet nog een keer te kijken of het een file of folder is. (toch? zo vaak gebruik ik dat ding niet). Ik dacht iig dat je een collection met Files, en een aparte met Folders hebt. Dus die check hoef je niet te doen, maar verder werkt het idee op zich precies hetzelfde...

Exact expert nodig?


  • pistole
  • Registratie: Juli 2000
  • Laatst online: 22-04 21:53

pistole

Frutter

Op vrijdag 18 januari 2002 20:46 schreef PlayR het volgende:

[..]
code:
1
2
3
4
5
roep de functie aan met de dir waar je wilt beginnen.
    loop door alle files die in die dir staan.
    is de file een dir?
      zo ja, print de naam, spring in en roep de functie weer aan, nu met de naam van die dir.
      no nee, print de filenaam
recursion rules :)
pseudo-code ook trouwens

Ik frut, dus ik epibreer


  • brammetje
  • Registratie: Oktober 2000
  • Laatst online: 12-01-2025
Op vrijdag 18 januari 2002 20:48 schreef Crazy_D het volgende:
PlayR typt sneller.
Enige subtiele verschil: met het scriptingobject hoef je niet nog een keer te kijken of het een file of folder is. (toch? zo vaak gebruik ik dat ding niet). Ik dacht iig dat je een collection met Files, en een aparte met Folders hebt. Dus die check hoef je niet te doen, maar verder werkt het idee op zich precies hetzelfde...
Mja, die van jou is iets simpeler uitgelegd :)
Verder ken ik geen ASP, dus dat van die aparte componenten zou goed kunnen zijn :)

  • pistole
  • Registratie: Juli 2000
  • Laatst online: 22-04 21:53

pistole

Frutter

http://msdn.microsoft.com/library/en-us/script56/html/jsoriFileSystemObjectObjects.asp?frame=true:
Scripting Runtime Library

FileSystemObject Objects
In This Section
Dictionary Object
Object that stores data key, item pairs.
Drive Object
Provides access to the properties of a particular disk drive or network share.
File Object
Provides access to all the properties of a file.
FileSystemObject Object
Provides access to a computer's file system.
Folder Object
Provides access to all the properties of a folder.
TextStream Object
Facilitates sequential access to file.
oftewel, je kan eerst het Folder object recursief doorlopen (als je een hele tree wilt laten zien) en daarna de inhoud van het File object weergeven

Ben je al wat verder, PhoneTechnician?

Ik frut, dus ik epibreer


  • PhoneTech
  • Registratie: Mei 2000
  • Laatst online: 22-04 08:47
Ik gooi alle directory's in een javascriptje zodat ik een mooie explorer folder stijl heb. De code die ik hiervoor gebruik is:
code:
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
<%For Each Folder in ObjFolders%>
            Tree[<%=i%>]  = "<%=i+1%>|0|<%=Folder.Name%>";
             <%
            set ObjSF = ObjFSO.GetFolder(Folder)
            set ObjSubFolders = ObjSF.SubFolders
            j = i
            k = i
            for each SubFolder in ObjSubFolders
                
                j = j + 1
                %>
                Tree[<%=j%>]  = "<%=j+1%>|<%=k+1%>|<%=SubFolder.Name%>";
                <%
                
            next
            

            i = j + 1
        next
        %>

wat de volgende javascript code oplevert (net zoals dit forum ongeveer)
code:
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
Tree[0]  = "1|0|Polos";
             
                Tree[1]  = "2|1|Polo Pique";
                
                Tree[2]  = "3|1|Polo Prestige";
                
                Tree[3]  = "4|1|Polo Tipping";
                
                Tree[4]  = "5|1|Zip Polo Tipping";
                
            Tree[5]  = "6|0|Rugby Shirts";
             
                Tree[6]  = "7|6|Fashion Rugby Stripe";
                
                Tree[7]  = "8|6|Fashion Rugby Uni";
                
                Tree[8]  = "9|6|Rugby Shirt";
                
            Tree[9]  = "10|0|Shirts";
             
                Tree[10]  = "11|10|Casual Shirt";
                
                Tree[11]  = "12|10|City Check Shirt";
                
                Tree[12]  = "13|10|City Stripe Shirt";
                
                Tree[13]  = "14|10|Dressed Shirt";
                
                Tree[14]  = "15|10|Poplin Shirt";
                
                Tree[15]  = "16|10|Twill Shirt";
                
                Tree[16]  = "17|10|Twill Shirt Uni";
                
            Tree[17]  = "18|0|Sweaters";
             
                Tree[18]  = "19|18|Fashion Sweater";
                
                Tree[19]  = "20|18|Heavy Sweater";
                
                Tree[20]  = "21|18|Outdoor Fleece Sweater";
                
                Tree[21]  = "22|18|Outdoor Fleece Zip Sweater";
                
                Tree[22]  = "23|18|Polo Sweater";
                
                Tree[23]  = "24|18|Zip Sweater";
                
            Tree[24]  = "25|0|Unsorted";
             
                Tree[25]  = "26|25|Large";

Ik moet wel aan de bovenstaande structuur houden en dat is best lastig om dat allemaal in een recusieve functie te zetten. Is wel mogelijk, maar erg moeilijk!

Ik ben nu druk aan het onderzoeken naar de recursieve functie en ik zal deze posten zodra deze werkt!

[edit]
even voor de duidelijkheid: dit soort plaatje krijg je dan:
Afbeeldingslocatie: http://www.dentol.nl/images/backimage.jpg

  • pistole
  • Registratie: Juli 2000
  • Laatst online: 22-04 21:53

pistole

Frutter

je zit een heel eind op de goede weg (mooi aangekleed in html trouwens), maar kijk nog eens naar de pseudo-code van PlayR.

Het voordeel van de recursieve aanpak is dat je met betrekkelijk weinig code heel veel gedaan krijgt. Je moet alleen wel goed denken aan de start- en vooral stopcondities van je functie... IIS vindt het niet leuk als je een eeuwige recursie hebt... (door schade en schande wijs geworden :7 )

Ik frut, dus ik epibreer


  • PhoneTech
  • Registratie: Mei 2000
  • Laatst online: 22-04 08:47
Zo...Ik heb een werkende demo...Alleen nog zonder inspringen, loop ik vast, ik denk dat ik nog meer variabelen met de functie moet meegeven maar het werkt wel :D

Hier is de code
code:
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
<%@LANGUAGE=VBScript %>
<%option explicit
Session.LCID = 1043 
Response.buffer = True
Server.ScriptTimeout = 2
%>
<!-- #INCLUDE FILE="../../includes/number12.asp" -->
<%
dim ObjFSO
dim ObjF
dim ObjFolders
dim imgFolder
dim dir
imgFolder   = rootfolder

Set ObjFSO = Server.CreateObject("Scripting.FileSystemObject")


Function ShowDir(Folder,ObjFSO)
dim ObjF
dim ObjFolders
dim i
Set ObjF = ObjFSO.GetFolder(Folder)
Set ObjFolders = ObjF.SubFolders

For Each Folder in ObjFolders
    i = i + 1
    if i = 0 then
        response.write Folder.Name & "<BR>"
    else
        response.write Folder.Name & "<BR>"
        ShowDir Folder,ObjFSO
    end if
next

end function
%>
<!DOCTYPE HTML PUBLIC "-//W3C//DTD HTML 4.0 Transitional//EN">
<html>
<head>
    <title>BackImage</title>
</head>
<body>
<%ShowDir imgFolder,ObjFSO%>

<%
Set ObjF = Nothing
Set ObjFSO = Nothing
Set ObjFolders = Nothing
gettime
%>

Ik denk dat het allemaal nog beter kan maar het werkt en is nog lekker snel ook :D, 30 milliseconden is snel zat :)

Alleen nu nog incombinatie met javascript en ik ben helemaal te vreden :D

  • pistole
  • Registratie: Juli 2000
  • Laatst online: 22-04 21:53

pistole

Frutter

top!

twee dingen:
wat is i=i+1 ??? Je initialiseert die variabele ook niet...

Maar dat is miereneukerij van mij...

Ik frut, dus ik epibreer


  • brammetje
  • Registratie: Oktober 2000
  • Laatst online: 12-01-2025
Op vrijdag 18 januari 2002 22:31 schreef PhoneTechnician het volgende:
Zo...Ik heb een werkende demo...Alleen nog zonder inspringen, loop ik vast, ik denk dat ik nog meer variabelen met de functie moet meegeven maar het werkt wel :D

Hier is de code
bluh, code..
Ik denk dat het allemaal nog beter kan maar het werkt en is nog lekker snel ook :D, 30 milliseconden is snel zat :)

Alleen nu nog incombinatie met javascript en ik ben helemaal te vreden :D
yuk, dit vind ik echt ranzige code. Maarja, daar kan jij niks aan doen, het blijft vBscript.. :)

Verder:
waar haal je die cijfertjes in je javascript vandaan?
Je doet nog niks met bestanden, alleen de folders?

  • pistole
  • Registratie: Juli 2000
  • Laatst online: 22-04 21:53

pistole

Frutter

Op vrijdag 18 januari 2002 22:48 schreef PlayR het volgende:

[..]
yuk, dit vind ik echt ranzige code. Maarja, daar kan jij niks aan doen, het blijft vBscript.. :)
Ook java of c kan ranzig zijn... zegt meer over de programmeur dan over de taal waarin je iets schrijft.

Ik frut, dus ik epibreer


  • brammetje
  • Registratie: Oktober 2000
  • Laatst online: 12-01-2025
Op vrijdag 18 januari 2002 22:49 schreef pistole het volgende:
Ook java of c kan ranzig zijn... zegt meer over de programmeur dan over de taal waarin je iets schrijft.
ja natuurlijk, maar dingen als:

* ShowDir Folder,ObjFSO
* response.write Folder.Name & "<BR>"
* code is lay-out gebonden (je kan code niet over regels spreiden)

dat is yuk aan vBscript..

  • pistole
  • Registratie: Juli 2000
  • Laatst online: 22-04 21:53

pistole

Frutter

Op vrijdag 18 januari 2002 22:57 schreef PlayR het volgende:

[..]

ja natuurlijk, maar dingen als:

* ShowDir Folder,ObjFSO
* response.write Folder.Name & "<BR>"
* code is lay-out gebonden (je kan code niet over regels spreiden)

dat is yuk aan vBscript..
ShowDir Folder, ObjFSO - what's wrong? Okee, alles is Variant in VBscript, dat is jammer
response.write Folder.Name & "<br>" en "code is layout gebonden" - Dat is niet waar. In dit geval misschien, maar je kan alles ook prima gescheiden houden.

het wordt een beetje off-topic, misschien zouden we discussie beter via icq ofzo kunnen voeren?

Ik frut, dus ik epibreer


  • PhoneTech
  • Registratie: Mei 2000
  • Laatst online: 22-04 08:47
Ik snap al die opmerkingen over de code niet. Ok, het ziet er rommelig uit, maar dit is even snel gemaakt om het te testen. Dit is dus niet de final code!

En natuurlijk moet ik alle data nog vorm geven. Net alsof iedereen de eerste keer precies netjes declareert!

Die i was gewoon een tellertje om te kijken hoeveel subdirs er in de directory staan. Als er 0 zijn dan moet hij de directory naam printen en als het meerdere zijn, dan moet hij de functie nog eeen keer uitvoeren.

Ik ben er nog druk mee bezig en zoiezo gaat alles in een array.

Ik ben nu gewoon nog druk bezig met alles uitproberen!

Ik zal vanavond of morgen wel weer een stuk code posten!

  • PhoneTech
  • Registratie: Mei 2000
  • Laatst online: 22-04 08:47
Ok, ik heb nu de volgende code:
code:
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
<%@LANGUAGE=VBScript %>
<%option explicit
Session.LCID = 1043 
Response.buffer = True
Server.ScriptTimeout = 2
%>
<!-- #INCLUDE FILE="../../includes/number12.asp" -->
<%
dim ObjFSO
dim ObjF
dim ObjFolders
dim imgFolder
dim dir
imgFolder   = rootfolder
Set ObjFSO = Server.CreateObject("Scripting.FileSystemObject")

Function ShowDir(Folder,ObjFSO)
    dim ObjF
    dim ObjFolders
    dim i

    Set ObjF = ObjFSO.GetFolder(Folder)
    Set ObjFolders = ObjF.SubFolders
    
    For Each Folder in ObjFolders
        response.write Folder.Name & "<BR>"
        ShowDir Folder,ObjFSO
    next
end function

ShowDir imgFolder,ObjFSO

Set ObjF = Nothing
Set ObjFSO = Nothing
Set ObjFolders = Nothing
gettime
%>

en deze produceert het volgende:
Polos
Polo Pique
Polo Prestige
Polo Tipping
Zip Polo Tipping
Rugby Shirts
Fashion Rugby Stripe
Fashion Rugby Uni
Rugby Shirt
Shirts
Casual Shirt
City Check Shirt
City Stripe Shirt
Dressed Shirt
Poplin Shirt
Twill Shirt
Twill Shirt Uni
Sweaters
Fashion Sweater
Heavy Sweater
Outdoor Fleece Sweater
Outdoor Fleece Zip Sweater
Polo Sweater
Zip Sweater
Unsorted
Large

Polos, Rugby Shirts, Shirts, Sweaters en Unsorted zijn directory's en de rest subdirs die in die directory's vallen.

Nu wil ik graag dat de subdir's worden ingesprongen..Hoe krijg ik dit voor elkaar?

Uiteindelijk moet de functie dit soort code gaan maken

Tree[0] = "1|0|Polos|#";
Tree[1] = "2|1|Polo Pique|#";
Tree[2] = "3|1|Polo Prestige|#";
Tree[3] = "4|1|En alle andere subdirs|#";
Tree[4] = "5|0|Rugby Shirts|#";
Tree[5] = "6|5|Bla|#";
Tree[6] = "7|5|Bla|#";
enz.enz.

waarvan Tree[0] de array is die gevuld wordt met "FolderID | OnderliggendNiveau | Naam | href";

Dit krijg ik dus absoluut niet voor elkaar :(

Kan iemand mij hierbij helpen?

  • PhoneTech
  • Registratie: Mei 2000
  • Laatst online: 22-04 08:47
HOERA! HOERB!

Ik heb het voor elkaar en als ik achter mij zelf kon gaan staan dan zou ik een schouderklopje geven (ik hoop dat jullie dit soort momenten ook wel eens hebben :P)

Het werkt echt harstikke mooi! En ik kan gewoon (als ik de juiste permissies heb gezet) overal inkomen :) Het werkt echt lekker:D

De code
code:
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
<%@LANGUAGE=VBScript %>
<%option explicit
Session.LCID = 1043 
Response.buffer = True
Server.ScriptTimeout = 2
%>
<!-- #INCLUDE FILE="../../includes/number12.asp" -->
<%
dim ObjFSO
dim ObjF
dim ObjFolders
dim imgFolder
dim dir
dim i
imgFolder   = "e:\"
Set ObjFSO = Server.CreateObject("Scripting.FileSystemObject")

Function ShowDir(Folder,ObjFSO,i)
    dim j
    dim ObjF
    dim ObjFolders

    Set ObjF = ObjFSO.GetFolder(Folder)
    Set ObjFolders = ObjF.SubFolders
    j = i
    For Each Folder in ObjFolders
        i = i + 1
        response.write "Tree[" & i-1 & "]  = """ & i & "|" & j & "|" & Folder.Name & """;<br>"
        ShowDir Folder,ObjFSO,i
    next
end function

i = 0
ShowDir imgFolder,ObjFSO,i

Set ObjF = Nothing
Set ObjFSO = Nothing
Set ObjFolders = Nothing
'gettime
%>

En een screenshot van de output :D

Afbeeldingslocatie: http://www.dentol.nl/images/backimage2.jpg

  • brammetje
  • Registratie: Oktober 2000
  • Laatst online: 12-01-2025
Op zaterdag 19 januari 2002 00:33 schreef PhoneTechnician het volgende:
Ik snap al die opmerkingen over de code niet. Ok, het ziet er rommelig uit, maar dit is even snel gemaakt om het te testen. Dit is dus niet de final code!
Hej, het had niks met jou te maken hoor :) Ik wilde er gewoon even uitbraken dat ik de syntax van VB niet mooi vind :)

Ik ben blij dat je er toch uitgekomen bent!
Pagina: 1