[vbscript]FSO in een array zetten

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

  • coldasice
  • Registratie: September 2000
  • Laatst online: 19-05 14:08

coldasice

business intelligence

Topicstarter
Hoe kan ik FileSystemObjects in een array zetten zodat ik ze daarna kan sorteren...bijvoorbeeld op datum....

code:
1
2
3
4
5
6
7
8
9
10
11
12
13
Dim arrFilesArray(300,15)
Set oFileSys = CreateObject("Scripting.FileSystemObject")
Set oFolder = oFileSys.GetFolder(PathNaam)

FilesArray oFileSys,oFolder,arrFilesArray,sURL

Function FilesArray(oFileSys,oFolder,byRef arrFilesArray,sURL)
    For Each oFile In oFolder.Files
    arrFilesArray(count,1) = oFile
        SchrijfRegels sExt,oFile,oFileSys,sURL
        count=count+1
    Next
End Function


heb hier een stukje code neergezet, ik hoop dat iemand me hiermee kan helpen

business-intelligence.info/freelance


  • j_du_pee
  • Registratie: Maart 2000
  • Laatst online: 23-09-2024

j_du_pee

du pain, du vin, du pee

volgens mij is het een eenvoudige oplossing:
code:
1
 arrFilesArray(count) = oFile

wordt
code:
1
 set arrFilesArray(count) = oFile

;)

kaart != map && bottel != fles
Wacht op antwoord


  • coldasice
  • Registratie: September 2000
  • Laatst online: 19-05 14:08

coldasice

business intelligence

Topicstarter
Microsoft VBScript runtime error '800a0009'
Subscript out of range: 'arrFilesArray'


dit is de foutmelding die ik krijg op jouw wijziging, ik had dat namelijk al geprobeerd maar het hielp niet....

business-intelligence.info/freelance


  • j_du_pee
  • Registratie: Maart 2000
  • Laatst online: 23-09-2024

j_du_pee

du pain, du vin, du pee

ja ok, die komt omdat je een tweedimensionale array hebt gedeclareerd. dus doe je set arrfilesarray(count,1). Maar heb je niet genoeg aan een 1-dimensionale :?

Het verschil zit hem iig vrij zeker in het gebruik van set...
code:
1
2
3
4
5
6
7
8
9
10
11
12
Dim arrFilesArray(300)
Function FilesArray(oFileSys,oFolder,byRef arrFilesArray,sURL)
    For Each oFile In oFolder.Files
    set arrFilesArray(count) = oFile
         ' SchrijfRegels sExt,oFile,oFileSys,sURL
          count=count+1
    Next
End Function

for each f in arrFilesArray
    wscript.stdout.write(f.name)
next

werkt iig (moet je wel ff afvangen waar de array nog niet gevuld is aangezien je lege plekken hebt. M.b.v. redim preserve kun je de array ook op de goede grootte maken ;) )
code:
1
2
3
Dim arrFilesArray(300)
wordt dan:
redim preserve arrFilesArray(oFolder.files.count-1)

[ Voor 7% gewijzigd door j_du_pee op 06-12-2004 14:43 ]

kaart != map && bottel != fles
Wacht op antwoord


  • coldasice
  • Registratie: September 2000
  • Laatst online: 19-05 14:08

coldasice

business intelligence

Topicstarter
ik met mijn stom hoofd heb deze regel rechtstreek overgenomen
code:
1
 set arrFilesArray(count) = oFile

had dit moeten zijn....
code:
1
 set arrFilesArray(count,1) = oFile


bedankt voor je hulp....

nu kan ik dit toch gewoon als object gaan sorteren en dan alle eigenschappen toch aanroepen he.....

business-intelligence.info/freelance


  • coldasice
  • Registratie: September 2000
  • Laatst online: 19-05 14:08

coldasice

business intelligence

Topicstarter
code:
1
2
3
4
5
6
7
8
9
10
     For Each oFile In oFolder.Files
                sExt = oFileSys.GetExtensionName(oFile.Name)
                set arrFilesArray(count,1) = oFile
                set test = arrFilesArray(count,1)   

                response.write oFileSys.GetExtensionName(test)
                response.write test.Name
        
                count=count+1
    Next


dit is nu de werkende code met het object test waarmee je alles kunt doen, dus nu kan ik ook eenvoudig sorteren op datum of op ext....

raar dat dit niet standaard kan bij FSO objecten

[ Voor 8% gewijzigd door coldasice op 06-12-2004 15:19 ]

business-intelligence.info/freelance


  • j_du_pee
  • Registratie: Maart 2000
  • Laatst online: 23-09-2024

j_du_pee

du pain, du vin, du pee

lottumracing schreef op maandag 06 december 2004 @ 15:19:
dit is nu de werkende code met het object test waarmee je alles kunt doen, dus nu kan ik ook eenvoudig sorteren op datum of op ext....
Hoe was je van plan dat aan te pakken, want voor zover ik weet zit dat ook niet standaard in arrays hoor :?

kaart != map && bottel != fles
Wacht op antwoord


Verwijderd

Hoe was je van plan dat aan te pakken, want voor zover ik weet zit dat ook niet standaard in arrays hoor :?
Ik ben ook benieuwd, want dat gaat niet zomaar. Zeker een multi-dimensie array (zoals in dit geval) kan je niet zonder een aantal extra loops sorten.

hint

Verwijderd

Je kan ook een recordset maken die je vervolgens kan sorteren:

code:
1
2
3
4
5
6
7
8
9
10
11
12
Set rstFiles = Server.CreateObject("ADODB.Recordset")
rstFiles.Fields.Append "name", adVarChar, 255
rstFiles.Fields.Append "date", adDate
rstFiles.Open

For Each objItem In objFolder.Files
    rstFiles.AddNew
    rstFiles.Fields("name").Value = objItem.Name
    rstFiles.Fields("date").Value = objItem.DateCreated
Next
rstFiles.Sort = "date"
rstFiles.MoveFirst

[ Voor 10% gewijzigd door Verwijderd op 06-12-2004 17:04 ]


  • j_du_pee
  • Registratie: Maart 2000
  • Laatst online: 23-09-2024

j_du_pee

du pain, du vin, du pee

Verwijderd schreef op maandag 06 december 2004 @ 17:04:
Je kan ook een recordset maken die je vervolgens kan sorteren:
Dat was wat ik ook wilde gaan voorstellen, maar wilde de TS er nog even zelf over laten nadenken ;)

kaart != map && bottel != fles
Wacht op antwoord


  • coldasice
  • Registratie: September 2000
  • Laatst online: 19-05 14:08

coldasice

business intelligence

Topicstarter
zijn toch genoeg standaard codes te vinden om een array te sorteren...

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
     function fnSort(byRef aSort, intAsc)
       Dim intTempStore
       Dim i, j
       For i = 0 To UBound(aSort) - 1
         For j = i To UBound(aSort)
         'Sort Ascending
         if intAsc = 1 Then
           if aSort(i) > aSort(j) Then
             intTempStore = aSort(i)
             aSort(i) = aSort(j)
             aSort(j) = intTempStore
           End if 'i > j
           'Sort Descending
         Else
           if aSort(i) < aSort(j) Then
             intTempStore = aSort(i)
             aSort(i) = aSort(j)
             aSort(j) = intTempStore
           End if 'i < j
         End if 'intAsc = 1
         Next 'j
       Next 'i
       fnSort = aSort
End function



code:
1
2
3
4
5
6
7
8
9
10
11
12
     Public function SorteerMArray2(byRef arrFilesArray,k)
     for i = UBound(arrFilesArray) - 1 To 0 Step -1
         for j= 1 to i
     
             if arrFilesArray(k,j)>arrFilesArray(k,j+1) then
                            temp0=arrFilesArray(k,j+1)
                            arrFilesArray(k,j+1)=arrFilesArray(k,j)
                            arrFilesArray(k,j)=temp0
             end if
         next
     next
     end function


om deze sorteer functies geschikt te maken voor string moet je strcomp in de if zetten en controleren op 1 of -1.....

[ Voor 8% gewijzigd door coldasice op 07-12-2004 09:39 ]

business-intelligence.info/freelance


  • coldasice
  • Registratie: September 2000
  • Laatst online: 19-05 14:08

coldasice

business intelligence

Topicstarter
het werkt nog steeds niet helemaal...

hij schrijft een string weg in de array in plaats van het object....


Object required: '[string: "D:\Intranet\intranet"]'

business-intelligence.info/freelance


  • j_du_pee
  • Registratie: Maart 2000
  • Laatst online: 23-09-2024

j_du_pee

du pain, du vin, du pee

wat staat er op de regel waar je het object in de array zet en wat staat er op de regel waar je deze melding krijgt :?
Je doet niet toevallig het volgende:
code:
1
set arrFilesArray(count,1) = oFile.name

kaart != map && bottel != fles
Wacht op antwoord


  • coldasice
  • Registratie: September 2000
  • Laatst online: 19-05 14:08

coldasice

business intelligence

Topicstarter
dit is de regel van wegschrijven....
code:
1
set arrFilesArray(count,1) = oFile


en dit is de regel van het terughalen van het object
code:
1
 set test2 = arrFilesArray(i,1)


dit is de regel waarop het mis gaat....

hij schrijft wel het object in de array maar ergens met sorteren zal het wel mis gaan...heb controle uitgevoerd en kan van het object de extensie opvragen en dat gaat goed...dus dat moet wel goed zijn....toch maar over naar 1 dimensie array...en dan sorteren....

[ Voor 81% gewijzigd door coldasice op 07-12-2004 13:59 ]

business-intelligence.info/freelance


  • coldasice
  • Registratie: September 2000
  • Laatst online: 19-05 14:08

coldasice

business intelligence

Topicstarter
het probleem is al opgelost

code:
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
     function fnSort2(byRef aSort, intAsc,oFileSys)
       Dim intTempStore
       Dim i, j
       For i = 0 To UBound(aSort) - 1
         For j = i To UBound(aSort) - 1
         'Sort Ascending
         a=oFileSys.GetExtensionName(aSort(j))
         b=oFileSys.GetExtensionName(aSort(j+1))
           if Strcomp(a,b,1)=-1 then
             set intTempStore = aSort(i)
             set aSort(i) = aSort(j)
             set aSort(j) = intTempStore
           End if
         next
       next
end function


code:
1
2
3
             set intTempStore = aSort(i)
             set aSort(i) = aSort(j)
             set aSort(j) = intTempStore


in de originele sorteer functie heb ik de set niet gebruikt....daarom verandert hij het object in een string.....nu werkt het allemaal en kun je FSO sorteren op what so ever

business-intelligence.info/freelance


  • j_du_pee
  • Registratie: Maart 2000
  • Laatst online: 23-09-2024

j_du_pee

du pain, du vin, du pee

lottumracing schreef op woensdag 08 december 2004 @ 08:51:
het probleem is al opgelost

code:
1
2
         a=oFileSys.GetExtensionName(aSort(j))
         b=oFileSys.GetExtensionName(aSort(j+1))
Volgens mij zoektt FSO nu steeds de extentie op terwijl je deze al hebt in je file object...
code:
1
           if Strcomp(a,b,1)=-1 then
Hier kijk je of a en b al dan niet hetzelfde zijn, dit geeft geen volgorde aan vwb alfabet of numeriek ;)
in de originele sorteer functie heb ik de set niet gebruikt....daarom verandert hij het object in een string.....nu werkt het allemaal en kun je FSO sorteren op what so ever
Staat er waarschijnlijk telkens weer geen set in ;)

anyway, ik vind het ook wel handig om een foldertje makkelijk op te vragen en te sorteren in VBS, dus ik dacht ik ga je code ff misbruiken in een classje ;) Er staat niet zoveel meer van jou in, maar wie weet heb je er ook wat aan.
Visual Basic .NET:
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
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
set d = new dir
d.open "E:\mp3\", d.SORT_SHUFFLE
for each f in d.files
    out f.name
next
class dir
    public SORT_DATE_CREATED 
    public SORT_NAME
    public SORT_TYPE
    public SORT_SHUFFLE
    
    public files()
    private mObjFSO
    Private sub class_initialize()
        set mObjFSO = createObject("scripting.filesystemobject")        
        SORT_DATE_CREATED = 4
        SORT_NAME = 1
        SORT_TYPE =2
        SORT_SHUFFLE = 3
    end sub
    private sub class_terminate()
        set mObjFSO = nothing
    end sub
    
    Public function open(sPath, sort)
        if mObjFSO.FolderExists(sPath) then
            set mDir = mObjFSO.GetFolder(sPath)
            redim preserve files(mDir.files.count-1)
            dim i
            i=0
            for each f in mDir.Files
                set files(i) = f
                i=i+1
            next
            open = sortDir(files,sort)
        else
            err.raise "001","initialize","Folder does not exist."
        end if      
    end function
    
    private function sortDir(arrSort, sortType)
        for i = UBound(arrSort) - 1 To 0 Step -1
            for j= 0 to i
                flip = false
                select case sortType
                    case SORT_DATE_CREATED
                        if arrSort(j).datecreated>arrSort(j+1).dateCreated then flip = true
                    case SORT_NAME
                        if lcase(arrSort(j).name)>lcase(arrSort(j+1).name) then flip = true
                    case SORT_TYPE
                        if lcase(arrSort(j).type)>lcase(arrSort(j+1).type) then flip = true
                    case SORT_SHUFFLE
                        randomize()
                        if rnd()>rnd() then flip = true
                end select
                if flip then
                    set temp=arrSort(j+1)
                    set arrSort(j+1)=arrSort(j)
                    set arrSort(j)=temp
                end if
            next
        next
        sortDir = arrSort
    end function        
end class

function out(str)
    wscript.stdout.writeline str
end function


edit, de shuffle zal zo nog niet helemaal goed werken bedenk ik net...

[ Voor 3% gewijzigd door j_du_pee op 08-12-2004 11:34 ]

kaart != map && bottel != fles
Wacht op antwoord


  • coldasice
  • Registratie: September 2000
  • Laatst online: 19-05 14:08

coldasice

business intelligence

Topicstarter
j_du_pee schreef op woensdag 08 december 2004 @ 11:24:
[...]

Volgens mij zoektt FSO nu steeds de extentie op terwijl je deze al hebt in je file object...

[...]

Hier kijk je of a en b al dan niet hetzelfde zijn, dit geeft geen volgorde aan vwb alfabet of numeriek ;)

[...]

Staat er waarschijnlijk telkens weer geen set in ;)
ik sorteer in dit geval op extensie maar omdat ik het gehele object met de set verplaats binnen de array gaat het goed....

en de strCmp geeft een 1 of -1....afhankelijk van de string beginletters...probeer maar eens...

business-intelligence.info/freelance


  • j_du_pee
  • Registratie: Maart 2000
  • Laatst online: 23-09-2024

j_du_pee

du pain, du vin, du pee

lottumracing schreef op woensdag 08 december 2004 @ 14:07:
[...]
en de strCmp geeft een 1 of -1....afhankelijk van de string beginletters...probeer maar eens...
I stand corrected :)

kaart != map && bottel != fles
Wacht op antwoord

Pagina: 1