Gå til innhold

Hvordan behandle alle filene i en angitt mappe?


Anbefalte innlegg

Driver og prøver å lage en filpakker i Visual Basic.

Det jeg lurer på, er hvordan man får programmet til å finne ut alle filene i en gitt mape slik at det kan pakke alle filene inn! Hvordan gjøres dette?

 

Blir nemlig litt tungvindt dersom brukeren må sitte å velge fil etter fil. :p

Lenke til kommentar
Videoannonse
Annonse

Et eksempel på bruk av Dir-funksjonen:

 

Public Sub ProcessFile(sFileName As String)

   ' Din kode her

End Sub

Public Sub ProcessFolder(Path As String, Optional sExtension As String = "*", Optional bSearchTree As Boolean)

   Dim sFile As String, sFolder As Variant, cFolders As New Collection
   
   ' Sett variabel
   sFile = Dir(ValidPath(Path), vbDirectory) ' Legg til AND vbHidden for å attpåtil søke etter skjulte filer
   
   ' Søk gjennom hele mappen
   Do Until sFile = ""
   
       ' Vi må ekskludere "." og "..", idet disse ikke er virkelige filer
       If sFile <> "." And sFile <> ".." Then
   
           ' Finner ut hvorvidt dette er en fil eller ei
           If sFile Like "*.*" Then
           
               ' Sjekk at filen etterfølger ett visst mønster - benytter RegEx
               If sFile Like sExtension Then
                   
                   ' Kjør filprosseringsrutinen
                   ProcessFile ValidPath(Path) & sFile
                   
               End If
           
           Else ' Vi har funnet en mappe
           
               ' Behold mappen for senere utforskning
               cFolders.Add sFile
           
           End If
       
       End If
   
       ' Gå videre til neste fil
       sFile = Dir
   Loop
   
   ' Søk gjennom alle undermapper, såfremt dette er spesifisert
   If bSearchTree Then
   
       For Each sFolder In cFolders
       
           ' Søk gjennom mappe
           ProcessFolder ValidPath(Path) & sFolder
           
       Next
   
   End If

End Sub

Public Function ValidPath(Path As String) As String

   ' Legg til en skråstrek dersom denne mangler i endelsen av strengen
   ValidPath = Path & IIf(Right(Path, 1) = "\", "", "\")

End Function

 

For å søke etter alle filer i eksempelvis C:\, gjør du som følger:

 

ProcessFolder "C:\"

 

Ved å endre sExtension kan du sågar søke etter spesifikke filendelser:

 

ProcessFolder "C:\", "*.txt"

 

I tillegg kan du dessuten søke i undermapper:

 

ProcessFolder "C:\", , True

 

Prosedyren ProcessFile er i dette tilfellet den som tar seg av filprosseringen, men du kan fint endre denne til andre prosedyrer.

Lenke til kommentar
Fikk det til. Men hvordan finner man ut om brukeren har valgt en fil eller en mappe i en "Åpne"-dialogboks?

Dette vises også i koden min, men jeg legger den ved likevel:

 

' sFile er filnavnet, ikke mappe OG filnavn
If sFile Like "*.*" Then
   ' Dette er en fil
Else
   ' Dette er en mappe
End If

Lenke til kommentar
Hvordan finner man ut hvilke filer brukeren har merket i en Common Dialog "åpne"-boks?

Benytter du cdlOFNAllowMultiselect? I så fall må du gjøre en del ekstraarbeid for å finne alle filer:

 

   Dim aArray, aFiles, Tell As Long

   ' Vis dialogboks
   comDialog.Filter = "*"
   comDialog.Flags = cdlOFNAllowMultiselect Or cdlOFNExplorer
   comDialog.ShowOpen

   ' Splitt streng opp i segmenter etter karakteren 0
   aArray = Split(comDialog.FileName, Chr(0))
   
   If UBound(aArray) - LBound(aArray) > 0 Then
   
       ' Realloker ny array
       ReDim aFiles(LBound(aArray) To UBound(aArray) - 1)
   
       ' Gå gjennom alle elementer og lag filnavnet
       For Tell = LBound(aFiles) To UBound(aFiles)
       
           ' Du finner funksjonen ValidPath i koden jeg postet ovenfor
           aFiles(Tell) = ValidPath(CStr(aArray(0))) & aArray(Tell + 1)
       
       Next
   
   Else
   
       ' Det første elementet er filnavnet
       aFiles = Array(aArray(LBound(aArray)))
   
   End If

 

Dersom du imidlertid ikke behøver å la brukeren kunne markere flere filer og mapper samtidig, er følgende alt som trengs:

 

' Henter filnavnet
sFile = comDialog.FileName

Endret av aadnk
Lenke til kommentar

Fungerer ikke nå heller :(

 

Bruker en listbox der filene legges til. Koden er nå slik:

 

 

 Dim aArray, aFiles, Tell As Long

  ' Vis dialogboks
  CommonDialog1.Filter = "*"
  CommonDialog1.Flags = cdlOFNAllowMultiselect Or cdlOFNExplorer
  CommonDialog1.ShowOpen

  ' Splitt streng opp i segmenter etter karakteren 0
  aArray = Split(CommonDialog1.FileName, Chr(0))
  
  If UBound(aArray) - LBound(aArray) > 0 Then
  
      ' Realloker ny array
      ReDim aFiles(LBound(aArray) To UBound(aArray) - 1)
  
      ' Gå gjennom alle elementer og lag filnavnet
      For Tell = LBound(aFiles) To UBound(aFiles)
      
          ' Du finner funksjonen ValidPath i koden jeg postet ovenfor
          aFiles(Tell) = ValidPath(CStr(aArray(0))) & aArray(Tell + 1)
      
         List1.AddItem aFiles(Tell)
      
      Next
      
   
  
  Else
      ' Det første elementet er filnavnet
      aFiles = Array(aArray(LBound(aArray)))
     List1.AddItem aFiles
  End If

 

Og hvordan kan jeg gjøre slik at brukeren kan legge til flere filer til i listen senere?

Lenke til kommentar

Uten å vite nøyaktig hvilken feilmelding du får når koden ekseveres, er det til dels vanskelig å vite eksakt hva som må gjøres, men jeg antar du bør heller bruke denne koden for å legge elementene til listeboksen etter koden jeg gav deg har kjørt:

 

For Tell = LBound(aFiles) To UBound(aFiles)
  List1.AddItem aFiles(Tell)
Next

 

Og hvordan kan jeg gjøre slik at brukeren kan legge til flere filer til i listen senere?

 

Da sletter du ganske enkelt ikke innholdet i listeboksen når du skal legge til filene. Med andre ord: ikke benytt List1.Clear.

Lenke til kommentar

Det funker bra nå. Men (ja, problemer igjen :p) - dersom du velger for mange filer (spesiellt på skrivebordet og andre mapper med lange baner), kommer programmet med feilmeldingen "The FileName buffer is too small to store the selected file name(s). Increase MaxFileSize". Prøvde å sette MaxFileSize til et større tall, men det nyttet ikke. Hva kan gjøres?

Lenke til kommentar

Opprett en konto eller logg inn for å kommentere

Du må være et medlem for å kunne skrive en kommentar

Opprett konto

Det er enkelt å melde seg inn for å starte en ny konto!

Start en konto

Logg inn

Har du allerede en konto? Logg inn her.

Logg inn nå
×
×
  • Opprett ny...