Jaffe Skrevet 13. april 2005 Del Skrevet 13. april 2005 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. Lenke til kommentar
kaffenils Skrevet 13. april 2005 Del Skrevet 13. april 2005 Bruk Dir() funskjonen. Du finner gode eksempler i VB hjelp. Lenke til kommentar
Jaffe Skrevet 13. april 2005 Forfatter Del Skrevet 13. april 2005 Fikk det til. Men hvordan finner man ut om brukeren har valgt en fil eller en mappe i en "Åpne"-dialogboks? Lenke til kommentar
aadnk Skrevet 13. april 2005 Del Skrevet 13. april 2005 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
aadnk Skrevet 13. april 2005 Del Skrevet 13. april 2005 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
Jaffe Skrevet 13. april 2005 Forfatter Del Skrevet 13. april 2005 Hvordan finner man ut hvilke filer brukeren har merket i en Common Dialog "åpne"-boks? Lenke til kommentar
aadnk Skrevet 13. april 2005 Del Skrevet 13. april 2005 (endret) 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 19. april 2005 av aadnk Lenke til kommentar
Jaffe Skrevet 19. april 2005 Forfatter Del Skrevet 19. april 2005 Funket fint den der, men nå har jeg et nytt problem... Dersom brukeren bare velger 1 fil, stopper programmet med "Subscript out of range". Lenke til kommentar
aadnk Skrevet 19. april 2005 Del Skrevet 19. april 2005 Jeg har nå lokalisert og uskadeliggjort problemet. Den oppdaterte koden befinner seg i posten ovenfor. Lenke til kommentar
Jaffe Skrevet 19. april 2005 Forfatter Del Skrevet 19. april 2005 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
aadnk Skrevet 19. april 2005 Del Skrevet 19. april 2005 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
Jaffe Skrevet 20. april 2005 Forfatter Del Skrevet 20. april 2005 Det funker bra nå. Men (ja, problemer igjen ) - 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
aadnk Skrevet 20. april 2005 Del Skrevet 20. april 2005 Vel, du kan lage din egen dialogboks som støtter flere filer. Lenke til kommentar
Anbefalte innlegg
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 kontoLogg inn
Har du allerede en konto? Logg inn her.
Logg inn nå