Avatar billede martin_moth Mester
03. juni 2002 - 15:48 Der er 3 kommentarer og
1 løsning

FileSystemObject - sortering af filer

Jeg oprettede http://www.eksperten.dk/spm/219678, som tjacob var så flink at give svaret på. Nu vil jeg gerne udvidde spørgsmålet lidt, så jeg læser alle filer af en bestemt type i en given mappe ind i et array, og der kan sorteres efter enten FilOprettet-datoen på filerne, filstørrelserne, filnavnene, og sidstEditeret-datoerne.

Dvs. hvis jeg vælger at filerne skal sorteres efter størresle, vil jeg omdøbe alle filer til 1.jpg, 2.jpg, 3.jpg hvor 1 er den største osv.

Da jeg ikke er helt gode venner med FileSystemObject endnu, håber jeg at en kan hjælpe. Håber ovenstående giver mening - ellers skriv for flere detajler.

/Martin
Avatar billede tjacob Juniormester
03. juni 2002 - 18:00 #1
Det er såmænd ikke så svært med FSO-delen. Det er sorteringen der er vanskelig, især med flere forskellige kriterier. For at kunne sortere et array skal der anvendes rekursive funktioner (altså funktioner der kalder sig selv), og det er altid svært (synes jeg). Men der er lavet nogen der hedder quicksort og bubblesort m.fl. prøv at se her:

http://www.vb-helper.com/tut1.htm

/tjacob
Avatar billede martin_moth Mester
03. juni 2002 - 19:57 #2
Sorteringsalgoritmer skal jeg nok selv finde ud af :)

Men hvordan får jeg læst de forskellige egenskaber (størrelse, dato...)?
Avatar billede tjacob Juniormester
04. juni 2002 - 11:03 #3
OK her er et forslag:

Dette er lavet som en Sub der tager 3 argumenter:

Private Sub Command2_Click()
    Dim a, b, c
   
    a = "C:\Documents and Settings\Tonny\Skrivebord\test1"  'sti-filnavn
    b = "txt"      'filtypen
    c = "Size"  'sorteringskriterie -SKAL være "Size" eller "Oprettet"
                    'eller "Navn" eller "Editeret" (i dette eksempel)
   
    SortAndRename a, b, c
End Sub

Sub SortAndRename(ByVal sFPath As String, ByVal sExt As String, ByVal sSortBy As String)

    Dim fso, sFis, sFo, aFi, acFi
    Dim i, count
    Dim FilesArr(), TempArr(), SortedArr()
   
    Set fso = CreateObject("Scripting.FileSystemObject")
    Set sFo = fso.GetFolder(sFPath)
    Set sFis = sFo.Files
   
    count = 0
    For Each aFi In sFis    'tæl antal filer af denne type
      If Right(aFi.Name, 4) = "." & sExt Then
          count = count + 1
      End If
    Next aFi
    ReDim FilesArr(1 To count)
    ReDim TempArr(1 To count)
    ReDim SortedArr(1 To count)
    count = 1
    For Each aFi In sFis    'skriv det fulde filnavn til FilesArr()
      If Right(aFi.Name, 4) = "." & sExt Then
          FilesArr(count) = sFPath & "\" & aFi.Name
          count = count + 1
      End If
    Next aFi
    For i = 1 To count - 1  'skriv den ønskede property til TempArr()
        Set acFi = fso.GetFile(FilesArr(i))
        Select Case sSortBy
            Case "Size"
                TempArr(i) = acFi.Size
            Case "Oprettet"
                TempArr(i) = acFi.DateCreated
            Case "Navn"
                TempArr(i) = acFi.Name
            Case "Editeret"
                TempArr(i) = acFi.DateLastModified
        End Select
    Next i
   
    'HER SORTERES tempArr() OG RÆKKEFØLGEN SKRIVES TIL SortedArr()
    'F.eks. Sådan: SortedArr(1)=3, SortedArr(2)=1, SortedArr(3)=2
   
    'Tjek her for eksisterende filnavne
   
    For i = 1 To count - 1  'ømdøb filerne til 'tal'.ext
        Set acFi = fso.GetFile(FilesArr(i))
        acFi.Name = SortedArr(i) & "." & sExt
    Next i

    Set sFo = Nothing
    Set sFis = Nothing
    Set aFi = Nothing
    Set fso = Nothing
    Set acFi = Nothing

End Sub

Den sidste For-Next løkke (som omdøber filerne) virker ikke uden værdier i SortedArr(). Altså uden sortering.

/tjacob
Avatar billede martin_moth Mester
04. juni 2002 - 11:32 #4
Det var acFi.DateCreated, acFi.Name, acFi.DateLastModified, ... jeg var ude efter. Og nu har jeg fået en masse ekstra - meget fornemt, jeg takker  mange gange!
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