Jag vill använda ett ADODB.recordset istället för en collection. Den anledning som mest tilltalar mig är den använda seek funktionen på recordseten. Programmet ska gå igenom en STOR partion och sedan lägga in en post på varje filändelse som finns och hur mycket plats totalt och hur många av filändelsen som finns Hej, tack det funkadeAnvända ADODB.recordset istället för collection
ex.
typ st storlek(kb)
.htm 30 10
.bak 600 60000
.dmp 10 300000
Jag har löst det med att göra en recursiv gång i FSO för att gå igenom alla mappar, och sedan lägga till det i en collection men det blir fruktansvärt söligt efter ett tag och det vore trevligt om jag med hjälp av sort funktionen kunde snabbt sortera om recordsetet på ex. antal eller storlek.
Notera att adodbrecordsetet är globalt. I strPath ligger directory som sökning ska börjas på.
Förslag på andra lösningar uppskattas också. (den som jag gjorde med collection blir seg och buggar ur efter ett antal recursioner). Fördelen är att om jag använder recordset är att jag kan för eller senare bygga ut den för att göra statestik på fördelningen av vilka filer som ändras mest och tar upp mest plats på datorn. Sparar DÅ undan recordsetinfo i en databas.
min kod so-far(som inte funkar :( ):
<code>
Option Explicit
Dim lngTotalkb As Long
Dim lngTotalfiler As Long
Dim strPath As String
Dim vidare As Cfiltypinfo
Dim rsFSO As ADODB.Recordset
Dim objFSO, objFolder, File
Sub listaADOBD()
rsFSO.MoveFirst
While Not rsFSO.EOF
Text2.Text = Text2.Text & rsFSO("Type").Value & rsFSO("Antal").Value & rsFSO("Size") & vbCrLf
rsFSO.MoveNext
Wend
End Sub
Private Sub Form_Load()
Set info = New Cfiltypinfo
Const adInteger = 3
Const adDate = 7
Const adVarChar = 200
'create an ADODB.Recordset and call it rsFSO
Set rsFSO = New ADODB.Recordset
'Open the FSO object
'create the various rows of the recordset
rsFSO.Fields.Append "Type", adVarChar, 200
rsFSO.Fields.Append "Antal", adInteger
rsFSO.Fields.Append "Size", adInteger
rsFSO.Open
End Sub
Sub ADODBlistingoffolders(strinPath) '
Dim subfolder
Set objFSO = CreateObject("Scripting.FileSystemObject")
Set objFolder = objFSO.GetFolder(strinPath)
ADODBaddfilestyp (objFolder)
For Each subfolder In objFolder.subfolders
ADODBlistingoffolders (subfolder.Path)
Next
Set objFolder = Nothing
Set objFSO = Nothing
End Sub
Private Sub ADODBaddfilestyp(ByVal infolder As Object)
Dim strData As String
Dim filNamnsLangd, varFinnsPunkten, itypLangd As Integer
Dim bSant As Boolean
Dim test
For Each File In infolder.Files
'hide any file that begins with the character to exclude
filNamnsLangd = Len(File.Name)
varFinnsPunkten = InStrRev(File.Name, ".")
If varFinnsPunkten = 0 Then
strData = "Tom"
Else
itypLangd = filNamnsLangd - varFinnsPunkten
strData = Right(File.Name, itypLangd)
End If
rsFSO.index = "Type"
rsFSO.Seek "=", Val(strData)
If rsFSO.EOF Then
rsFSO("Antal") = rsFSO("Antal") + 1
rsFSO("Size") = rsFSO("Size") + File.Size
Else
' Fånig kod som kollar att indata och namn är ok
If IsEmpty(File.Name) Then
MsgBox "Error! No Name"
Else
rsFSO.AddNew
rsFSO("Type") = strData
rsFSO("Antal") = 1
rsFSO("Size") = File.Size
rsFSO.Update
End If
End If
Next
End Sub
Sub startaMedAttSkapaObject()
Set objFSO = Server.CreateObject("Scripting.FileSystemObject")
Set objFolder = objFSO.GetFolder(strPath)
ADODBaddfilestyp objFolder
Set objFolder = Nothing
Set objFSO = Nothing
End Sub
</code>Sv: Använda ADODB.recordset istället för collection
Jag gissar att det är seek metoden som inte funkar för dig.
Vill minnas att det står någonstans att det ska fungera men det gör det inte.
Seek metoden fungerar i DAO men inte i ADO.
Du får använda Find metoden istället.
Exempel:
<code>
If (Not rsFSO.BOF) And (Not rsFSO.EOF) Then
rsFSO.MoveFirst
End If
rsFSO.Find "Type = '" & strData & "'"
</code>
För att optimera sökningen kan du sätta ett index på fältet:
<code>
With rsFSO.Fields
.Append "Type", adVarChar, 200
.Append "Antal", adInteger
.Append "Size", adInteger
End With
With rsFSO
.CursorLocation = adUseClient 'Enable index creation
.Open
.Fields("Type").Properties("Optimize") = True
End With
</code>Sv: Använda ADODB.recordset istället för collection
Konstigt att inte seek funkar dock :(