Avatar billede ow.ob Nybegynder
30. juli 2001 - 08:59 Der er 5 kommentarer og
1 løsning

Alle filnavne og størrelser via API kald.

Findes der et API kald der returnerer en eller anden datastruktur med navne og størrelser på samtlige filer på harddisken.

Jeg bruger idag en rekursiv søgning (findfirstfile & findnextfile), men jeg nægter at tro at det er den hurtigste metode. Er der nogen der ved noget ?
Jeg har set andre programmer der på få sekunder henter 10000 filnavne. Hvordan h.... gør de det.
Avatar billede dr.truti Nybegynder
04. august 2001 - 13:12 #1
Bruger du løkker i din kode ????
hvis ja hvilke ?

og hvis du har mulighed for det så smid lige koden ud :)

Truti
Avatar billede mikker Nybegynder
04. august 2001 - 23:44 #2
dr.truti>> Ville det ikke være spildt arbejde hvis han smed koden ud?
Og hvordan skulle han gøre det sådan rent fysisk? - Bare ud af vinduet med toweret? :-)

Don\'t mind me - I\'m just tired :-)

- Mikker
Avatar billede dr.truti Nybegynder
05. august 2001 - 00:02 #3
mikker > Hold da kæft en dårlig humor *Loller*
Avatar billede reficul Nybegynder
05. januar 2002 - 21:35 #4
Hurra for Windows API:

Private Const MAX_PATH = 260
Private Const FILE_ATTRIBUTE_DIRECTORY = &H10

Private Type FILETIME
        dwLowDateTime As Long
        dwHighDateTime As Long
End Type
Private Type WIN32_FIND_DATA
        dwFileAttributes As Long
        ftCreationTime As FILETIME
        ftLastAccessTime As FILETIME
        ftLastWriteTime As FILETIME
        nFileSizeHigh As Long
        nFileSizeLow As Long
        dwReserved0 As Long
        dwReserved1 As Long
        cFileName As String * MAX_PATH
        cAlternate As String * 14
End Type

Private Declare Function FindFirstFile Lib \"kernel32\" Alias \"FindFirstFileA\" (ByVal lpFileName As String, lpFindFileData As WIN32_FIND_DATA) As Long
Private Declare Function FindNextFile Lib \"kernel32\" Alias \"FindNextFileA\" (ByVal hFindFile As Long, lpFindFileData As WIN32_FIND_DATA) As Long
Private Declare Function FindClose Lib \"kernel32\" (ByVal hFindFile As Long) As Long

Sub Main()
    SearchDir \"C:\"
End Sub


Sub SearchDir(strDir As String)
    Dim hFind As Long, strFilename As String
    Dim lpFindData As WIN32_FIND_DATA
    hFind = FindFirstFile(strDir & \"\\\" & \"*.*\", lpFindData)
    If hFind Then
        strFilename = Left(lpFindData.cFileName, InStr(1, lpFindData.cFileName, Chr(0)) - 1)
        If Not strFilename = \".\" And Not strFilename = \"..\" Then
            Debug.Print strDir & \"\\\" & strFilename & \" (\" & lpFindData.nFileSizeLow & \" bytes)\"
            If lpFindData.dwFileAttributes And FILE_ATTRIBUTE_DIRECTORY Then
                Call SearchDir(strDir & \"\\\" & strFilename)
            End If
        End If
        While FindNextFile(hFind, lpFindData)
            strFilename = Left(lpFindData.cFileName, InStr(1, lpFindData.cFileName, Chr(0)) - 1)
            If Not strFilename = \".\" And Not strFilename = \"..\" Then
                Debug.Print strDir & \"\\\" & strFilename & \" (\" & lpFindData.nFileSizeLow & \" bytes)\"
                If lpFindData.dwFileAttributes And FILE_ATTRIBUTE_DIRECTORY Then
                    Call SearchDir(strDir & \"\\\" & strFilename)
                End If
            End If
            DoEvents
        Wend
        Call FindClose(hFind)
    End If
End Sub

Du kan jo bare skifte Debug.Print ud med noget andet!

/ReFiCuL
Avatar billede ow.ob Nybegynder
06. januar 2002 - 08:59 #5
Det mindede meget om det jeg havde selv, men i mellemtiden har jeg fundet ud af at hvis jeg istedet bruger VB funktionen \"filelen\" kombineret med ovenstående kører det langt hurtigere, end hvis jeg hentede filstørrelsen via API kaldet, som jeg gjorde tidligere. Underligt, men \"if it works, don\'t fix it\"
Avatar billede reficul Nybegynder
06. januar 2002 - 16:29 #6
Huh?! Det virker da mærkeligt at FileLen skulle bruge mindre computer kræft en at hente nFileSizeLow fra WIN32_FIND_DATA. Dette burde i teorien blot tage 1 clockcyclus plus RAM delay plus tiden for at konvertere det til tekst.
FileLen skal først til at finde filen i filsystemet og så læse størrelsen. Og så oven i det tiden for at konvertere det til tekst.
Men selvfølgelig hvis du før bruge API-funktionen CreateFile, GetFileSize og CloseHandle, så ville det tage langt længere tid, men hvorfor gøre det, når WIN32_FIND_DATA indeholder alle informationerne?!
Avatar billede Ny bruger Nybegynder

Din løsning...

Tilladte BB-code-tags: [b]fed[/b] [i]kursiv[/i] [u]understreget[/u] Web- og emailadresser omdannes automatisk til links. Der sættes "nofollow" på alle links.

Loading billede Opret Preview
Kategori
Kurser inden for grundlæggende programmering

Log ind eller opret profil

Hov!

For at kunne deltage på Computerworld Eksperten skal du være logget ind.

Det er heldigvis nemt at oprette en bruger: Det tager to minutter og du kan vælge at bruge enten e-mail, Facebook eller Google som login.

Du kan også logge ind via nedenstående tjenester