Gå til innhold

Hjelp til System.IO.File.Copy..!


Anbefalte innlegg

Videoannonse
Annonse

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
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

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
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

Hei igjen! Koden fungerer som bare det den! :) Både slettinga, og kopieringa! :D

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
Hei igjen! Koden fungerer som bare det den! :) Både slettinga, og kopieringa! :D

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

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...