ze5400 Skrevet 14. juli 2007 Del Skrevet 14. juli 2007 Nesten ' Setter variablen Folders() til den riktige banen stemmer ikke helt. Det den gjør er å laste alle mappenavnene inn i arrayet, men you got the point Samme for filene Men ellers ser det flotters ut Lenke til kommentar
AnaXyd Skrevet 14. juli 2007 Forfatter Del Skrevet 14. juli 2007 Hehe! Alltid gøy å lære noe ut av det også.. Får se om jeg klarer å sette isammen noe slik selv neste gang! Men jeg har jo fått god hjelp herfra og da..! Takk! Lenke til kommentar
Degeim Skrevet 14. juli 2007 Del Skrevet 14. juli 2007 Tilbake til min kverulering angående rekkefølgen. Grunnen til at jeg tenkte slik var at jeg uten tvil ville listet alle filene i alle mappene og laget progressbaren ut av dem. Det du gjør nå er okei så lenge vi har relativt få filer i hver mappe, men om det er mapper og undermapper med flere tusen filer i hver mappe på C:, så vil det ta tid og slette hver mappe, og dermed lang tid mellom hver øking av verdi på progressbaren. Se om du finner ut (jeg (og flere her) vet det, men mer lekse) hvordan du ved hjelp av GetFiles og GetDirectories kan liste alle filer i undermapper, og så slette alle filer først og deretter slette alle (tomme) mapper etterpå. Da vil progressbaren oppføre seg mye bedre, med ett hakk per fil, i stedet for ett hakk per mappe (og fil i root-mappen). Lenke til kommentar
ze5400 Skrevet 14. juli 2007 Del Skrevet 14. juli 2007 Helt klart en bedre løsning. Men i og met at det er en PSP som skal formateres regner jeg ikke med det har så mye å si Lenke til kommentar
AnaXyd Skrevet 14. juli 2007 Forfatter Del Skrevet 14. juli 2007 Såklart, er jo enig med Degeim her jeg også... Men i og med at det er en PSP, er det ikke så mange filer som skal slettes! Men, for å lære, så burde jeg vel prøve meg på det du nevner her Degeim! Takk! Lenke til kommentar
GeirGrusom Skrevet 15. juli 2007 Del Skrevet 15. juli 2007 Tilbake til min kverulering angående rekkefølgen. Grunnen til at jeg tenkte slik var at jeg uten tvil ville listet alle filene i alle mappene og laget progressbaren ut av dem. Det du gjør nå er okei så lenge vi har relativt få filer i hver mappe, men om det er mapper og undermapper med flere tusen filer i hver mappe på C:, så vil det ta tid og slette hver mappe, og dermed lang tid mellom hver øking av verdi på progressbaren. Se om du finner ut (jeg (og flere her) vet det, men mer lekse) hvordan du ved hjelp av GetFiles og GetDirectories kan liste alle filer i undermapper, og så slette alle filer først og deretter slette alle (tomme) mapper etterpå. Da vil progressbaren oppføre seg mye bedre, med ett hakk per fil, i stedet for ett hakk per mappe (og fil i root-mappen). 9074262[/snapback] egentlig burde man vel slettet alle filer med en rekursiv funksjon for å få progressbaren riktig, men foreløpig synes jeg dette er bra nok. Jeg fikk det ikke sånn jeg ville ha det, like greit siden man måtte målt tekststrengen for å få det til, men likevel så er det vel så krunglete å skrive en rekursiv funksjon. Lenke til kommentar
Degeim Skrevet 15. juli 2007 Del Skrevet 15. juli 2007 Det er vel ikke flere forskjeller mellom rekursiv og listing av alle filer enn at progressbaren ikke tar hensyn til tiden det tar å liste filene (som helt sant kan bli ganske lang hvis det er snakk om mange filer)? Lenke til kommentar
AnaXyd Skrevet 15. juli 2007 Forfatter Del Skrevet 15. juli 2007 Hmm, er det noen mulighet for å få slettekoden til å slette skrivebeskyttede filer også? Det er noen filer på PSP'n som er skrivebeskyttet, og de er på alle PSP'er. (De blir lagt tilbake av programmet mitt etterpå) Men det ser ut som programmet ikke liker de filene. Her er erroren: Access to the path 'G:\PSPD\MEMSTICK.IND' is denied. Er det noen mulighet? Lenke til kommentar
aadnk Skrevet 15. juli 2007 Del Skrevet 15. juli 2007 Er det noen mulighet? 9077052[/snapback] Fjern skrivebeskyttelsen: Dim oFile As New IO.FileInfo("C:\Test.txt") oFile.Attributes = oFile.Attributes And (Not IO.FileAttributes.ReadOnly) Lenke til kommentar
ze5400 Skrevet 15. juli 2007 Del Skrevet 15. juli 2007 Er ikke nudvendig å sjekke attributteren på alle filene heller, så try catch det. I catchen sjekker du om den er skrivebeskyttet, hvis ja, fjern skrivebeskyttelsen, slett fila. Gå videre til neste fil Lenke til kommentar
aadnk Skrevet 15. juli 2007 Del Skrevet 15. juli 2007 Er ikke nudvendig å sjekke attributteren på alle filene heller, så try catch det. 9077161[/snapback] Det er unødvendig å bruke Exceptions til dette da en godt kan hente en liste over alle filene med attributter via IO.DirectoryInfo.GetFiles (internt bruker begge FindFirstFile) uten noen form for tap av hastighet. Lenke til kommentar
ze5400 Skrevet 15. juli 2007 Del Skrevet 15. juli 2007 Stemmer nok det ja, når du sier det slik Lenke til kommentar
Manfred Skrevet 17. juli 2007 Del Skrevet 17. juli 2007 Exceptions i en slik sammenheng vil gå utover hastighten, ja... Lenke til kommentar
AnaXyd Skrevet 21. juli 2007 Forfatter Del Skrevet 21. juli 2007 Hei igjen! Koden fungerer som bare det den! Både slettinga, og kopieringa! Men det er noe, når programmet kopierer litt store filer, så henger programmet. Du kan liksom ikke få kontakt programmet. Det henger med andre ord. Er det noen mulighet for å fikse dette? Lenke til kommentar
GeirGrusom Skrevet 21. juli 2007 Del Skrevet 21. juli 2007 Hei igjen! Koden fungerer som bare det den! Både slettinga, og kopieringa! Men det er noe, når programmet kopierer litt store filer, så henger programmet. Du kan liksom ikke få kontakt programmet. Det henger med andre ord. Er det noen mulighet for å fikse dette? 9116484[/snapback] Grunnen til dette, er at programmet venter til filen er ferdig kopiert, det finnes to måter å unngå dette på: - annen thread som gjør jobben - man implementerer kopieringsrutinen selv Jeg ville valgt første, fordi det er mye mindre kode, men hvis noe av dette er for avansert, ville jeg kanskje ventet med det. Grunnen er at for å endre verdien i en statusbar fra en annen thread, så må man bruke en funksjon som heter Invoke, som tar ett eller to parameter, det første er en delegate, altså en peker til en funksjon, og det andre er eventuelle parameter til denne funksjonen. // C#, siden jeg er såpass rusten i VB.NET using System; using System.Threading; using System.Windows.Forms; class MyCopyFileClass : Form { protected volatile bool thread_running; public delegate void SetProgressBareValueDelegate(int value); public void SetProgressBarValue(int value) { progress.Value = value; } public void UpdateCopyThread() { thread_running = true; // Kopier filene her // Pseudo kode foreach(file in files) { if(!thread_running) break; file.Copy(dst); // Her oppdaterer den progressbaren, bytt ut value med riktig verdi. Invoke(new SetProgressBarValueDelegate(SetProgressBarValue), new object[] { progressValue } ); } } public void CopyAllFilesFromDir(string src, string dst) { System.Threading.Thread copy_thread; // Denne vil faktisk gjøre all jobben, // Den vanlige tråpden skal bare sørge for at GUI reagerer copy_thread = new Thread(this.UpdateCopyThread); copy_thread.Start(); thread_running = true; while(copy_thread.IsAlive && thread_running) { Application.DoEvents(); } } } Dette er ikke et eksempel som vil fungere med en gang, men den viser i hovedtrekk hvordan det kan gjøres. 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å