Avatar billede jackass- Nybegynder
20. december 2005 - 12:27 Der er 15 kommentarer og
1 løsning

Copy dir inkl progressbar

Hej,

Jeg er ved at lave et lille app som bl.a. skal kopiere "c:\documents and settings\username" (filer og subdirs) til et netværksdrev. Men jeg kan sgutte hitte ud af hvordan.

Er der nogen der kan fortælle mig hvordan det gøres, inkl. progressbar?

På forhånd tusind tak :)

/jack
Avatar billede jackass- Nybegynder
20. december 2005 - 14:12 #1
Altså i bund og grund:

Copy *.* (inkl subdirs) fra Path1 til Path2, og vise progressbar for kopieringen.

Jeg går ud fra at den også skal kontrollere om Path2 eksisterer, og hvis ikke, så oprette mappen.. Og hvad hvis der i forvejen ligger filer med samme navne - kan de overskrives med "de nye"?

Jeg er villig til at spæde godt i kassen med point, hvis en vil hjælpe mig til mål med dette :D

/jack
Avatar billede kroning Nybegynder
20. december 2005 - 14:42 #2
Hvis du vil have en bar længden af alle filer så skal du først indsamle oplysninger om alle de filer der skal kopieres for at vide hvor mange bytes der er total. Og hvis du vil have en bar for den enkelte fil så skal du lave din egen kopi funktion. Altså en bar for kopieret total og en anden bar for aktuelle fil der kopieres.
Jeg fik engang en mp3 afspiller og så lavede jeg et lille program der tog tilfældige mp3 filer fra min harddisk og lage over på afspilleren, koden kan måske give dig nogle ideer. Programmet samler alle mp3 filer fra en bestemt mappe og alle undermapper inden kopieringen starter.

unit MainUnit;

interface

uses
  Windows, Messages, SysUtils, Variants, Classes, Graphics, Controls, Forms,
  Dialogs, StdCtrls, Buttons;

type
  TMainForm = class(TForm)
    FileList: TMemo;
    BtnStart: TBitBtn;
    LabelAntal: TLabel;
    OverfortList: TMemo;
    LabelOverfort: TLabel;
    BtnStop: TBitBtn;
    procedure BtnStartClick(Sender: TObject);
    procedure BtnStopClick(Sender: TObject);
  private
    { Private declarations }
    procedure Findfiler;
    procedure KopierFiler;
  public
    { Public declarations }
  end;

var
  MainForm: TMainForm;
  DoStop : boolean = false;

const
    Mp3Target = 'J:\';
  Mp3Source = 'D:\Mp3\Musik\';

implementation

{$R *.dfm}

procedure TMainForm.Findfiler;

procedure Start(Sti : string);
var
    Rec    : tsearchrec;
  FindResult    : integer;
begin
    FindResult:=FindFirst(Sti+'*.*',faAnyFile    ,Rec);
    while FindResult=0 do
    begin
        if (Rec.Attr=faDirectory) and (Rec.Name<>'.') and (Rec.Name<>'..') then
        Start(Sti+Rec.Name+'\')
    else
    begin
        if UpperCase(ExtractFileExt(Rec.Name))='.MP3' then
                FileList.Lines.Add(Sti+Rec.Name);
      end;
    FindResult:=FindNext(Rec);
    end;
    FindClose(Rec);
end;

begin
    FileList.Clear;
  OverfortList.Clear;

    FileList.Lines.Text:='Henter filer...';
  FileList.Update;
  FileList.Lines.BeginUpdate;
    Start(Mp3Source);
  FileList.Lines.EndUpdate;
  FileList.Lines.Delete(0);
 
  LabelAntal.Caption:='Total antal: '+Inttostr(FileList.Lines.Count);
end;

procedure TMainForm.KopierFiler;
var
    i : integer;
  Filnavn : string;
  CopyResult : boolean;
begin
    OverfortList.Lines.Add(datetimetostr(now));
    Randomize;
    repeat
      i:=Random(FileList.Lines.Count);
      Filnavn:=FileList.Lines[i];
    FileList.Lines.Delete(i);

    CopyResult:=CopyFile(PChar(Filnavn),PChar(Mp3Target+ExtractFileName(Filnavn)),true);
      OverfortList.Lines.Add(ExtractFileName(Filnavn));
        LabelOverfort.Caption:='Overført: '+Inttostr(OverfortList.Lines.Count);

    Application.ProcessMessages;
    until (DoStop) or (not CopyResult) {or (OverfortList.Lines.Count=10)};
  OverfortList.Lines.Add(datetimetostr(now));
end;

procedure TMainForm.BtnStartClick(Sender: TObject);
begin
    FindFiler;
  KopierFiler;
end;

procedure TMainForm.BtnStopClick(Sender: TObject);
begin
    DoStop:=true;
end;

end.
Avatar billede jackass- Nybegynder
20. december 2005 - 15:11 #3
Nu er jeg meget lidt Delphi haj (for at sige det mildt) så jeg kan ikke lige hitte hovede og hale i det der..

Er det muligt at få et funktionelt eksempel? :)
Avatar billede kroning Nybegynder
20. december 2005 - 17:01 #4
Jeg kan lave et eks. i morgen hvis ikke andre kommer først.
Avatar billede kroning Nybegynder
20. december 2005 - 17:11 #5
Avatar billede eht Nybegynder
20. december 2005 - 20:18 #6
Hvis du er tilfreds med Windows progressbar kan du bruge denne

Uses shellApi;

function KopierMappe(Kilde, Destination: string): LongInt;
var
  F: TShFileOpStruct;
  //sKilde, sDestination: string;
begin
  Result := 0;
  Kilde := Kilde + #0;
  Destination := Destination + #0;

  with F do
  begin
    Application.ProcessMessages;
    Wnd := Application.Handle;
    wFunc := FO_COPY;
    pFrom := @Kilde[1];
    pTo := @Destination[1];
    fFlags := FOF_ALLOWUNDO or FOF_NOCONFIRMATION;
  end;

  Result := ShFileOperation(F);
end;

procedure TForm1.Button1Click(Sender: TObject);
begin
KopierMappe('c:\en mappe','d:\kopi af mappen');
end;
Avatar billede jackass- Nybegynder
20. december 2005 - 23:24 #7
kroning: jeg ville blive _meget_ glad for et eksempel :)

For lige at opsummere..:

Jeg har et SourceDir (fx "c:\documents and settings\mig\", alt i denne mappe inkl. subdirs m.v. vil jeg gerne kopiere til DestDir (fx "e:\backup\"), samtidig med kopieringen gøres synlig med en progressbar (eller gauge).

Hvis der i forvejen er nogen filer i e:\backup\, skal de bare overskrives..

Mvh
/jack :)
Avatar billede kroning Nybegynder
21. december 2005 - 15:26 #8
Du kan hente eks. her:
http://www.kroning.dk/Kopi.zip

Jeg har brugt kopi funktionen fra siden:
http://www.delphicorner.f9.co.uk/articles/misc4.htm
Avatar billede jackass- Nybegynder
22. december 2005 - 13:44 #9
Det er verdensklasse kroning.. præcis det jeg eftersøgte!! :D

Men.. Jeg får denne fejl når kopieringen når til en fil som er i brug:

First chance exception at $7C81EB33. Exception class EFOpenError with message 'Cannot open file "C:\Documents and Settings\John Doe\Cookies\index.dat". The process cannot access the file because it is being used by another process'. Process FetchIT.exe (192)

..hvilket er pga denne linie:

sStream := TFileStream.Create(SrcFile, fmOpenRead or fmShareDenyWrite);

Så jeg skal vel på en eller anden måde kontrollere, om den pågældende fil som der forsøges at create en filestream på, overhovedet er læsbar, ellers hoppe videre til næste fil?

/jack
Avatar billede kroning Nybegynder
22. december 2005 - 15:29 #10
Ja jeg har ikke puttet nogen try except ind, men hvis du smider en ind f.eks. omkring DoCopyFile funktionen så vil kopieringen fortsætte:

try
  DoCopyFile(Sti+Rec.Name,EditTil.Text+SubDir+Rec.Name);
except
  on E: Exception do begin
  Application.MessageBox(PChar('Kan ikke kopiere filen: '+Rec.Name+' Fejl: '+E.Message),'Fejl',MB_OK or MB_ICONERROR);
  end;
end;

istedet for Application.MessageBox kan du så f.eks. skrive en besked i en log memo så brugeren ikke skal trykke på OK.
Avatar billede jackass- Nybegynder
22. december 2005 - 15:45 #11
Ja, men problemet er jo at:

sStream := TFileStream.Create(SrcFile, fmOpenRead or fmShareDenyWrite);

..fejler. Den kan ikke create den filestream. Så fejlen opstår ikke nede CopyFiles() (eller rettere Start()) proceduren, men derimod i DoCopyFile() hvor jeg ikke kan bruge den try/except du skriver, fordi den ikke kender Rec og SubDir.

Har du et alternativ? :)

/jack
Avatar billede kroning Nybegynder
22. december 2005 - 15:48 #12
Har du prøvet?
Avatar billede jackass- Nybegynder
23. december 2005 - 09:46 #13
Ja, og jeg får samme fejl som i kommentaren 22/12-2005 13:44:25 .. altså i den linie der :)

Hvis jeg bruger den try except du skrev før, virker det fint hvis filen bare ikke kan kopieres - men jeg får stadig fejl når filestream skal creates
Avatar billede kroning Nybegynder
23. december 2005 - 19:54 #14
Er du sikker på det for det virker fint her, kommer fejlen ikke kun i Delphi IDE?
Avatar billede jackass- Nybegynder
03. januar 2006 - 15:42 #15
Du har sq ret.. det er kun i Delphi IDE :)

Tusind tak for hjælpen.. Smider du et svar?
Avatar billede kroning Nybegynder
03. januar 2006 - 18:21 #16
jep.
Avatar billede Ny bruger Nybegynder

Din løsning...

Tilladte BB-code-tags: [b]fed[/b] [i]kursiv[/i] [u]understreget[/u] Web- og emailadresser omdannes automatisk til links. Der sættes "nofollow" på alle links.

Loading billede Opret Preview
Kategori
Kurser inden for grundlæggende programmering

Log ind eller opret profil

Hov!

For at kunne deltage på Computerworld Eksperten skal du være logget ind.

Det er heldigvis nemt at oprette en bruger: Det tager to minutter og du kan vælge at bruge enten e-mail, Facebook eller Google som login.

Du kan også logge ind via nedenstående tjenester