Gå til innhold

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


Anbefalte innlegg

Skrevet

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

Videoannonse
Annonse
Skrevet

Hehe! :D 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!

Skrevet

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

Skrevet

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! :)

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

Skrevet

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

Skrevet

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?

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

Skrevet

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

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

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? :)

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

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å
  • Hvem er aktive   0 medlemmer

    • Ingen innloggede medlemmer aktive
×
×
  • Opprett ny...