Delphi-PRAXiS

Delphi-PRAXiS (https://www.delphipraxis.net/forum.php)
-   Programmieren allgemein (https://www.delphipraxis.net/40-programmieren-allgemein/)
-   -   Verschiedene Möglichkeiten zum Verschieben von Dateien (https://www.delphipraxis.net/62774-verschiedene-moeglichkeiten-zum-verschieben-von-dateien.html)

Angel4585 9. Feb 2006 12:53


Verschiedene Möglichkeiten zum Verschieben von Dateien
 
Hallo zusammen,

ich suche gerade nach verschiedenen Möglichkeiten eine Datei von A nach B zu kopieren.

Bis jetzt hab ich 5 Möglichkeiten:

1.:
Delphi-Quellcode:
FUNCTION TtfMain.QuickCopy ( Quelle, Ziel : STRING ) : BOOLEAN;
VAR
  S, T: TFileStream;
BEGIN
  Result := TRUE;
  S := TFileStream.Create( Quelle, fmOpenRead );
  TRY
    TRY
      T := TFileStream.Create( Ziel, fmOpenWrite OR fmCreate );
    EXCEPT
      Screen.Cursor := crDefault;
      MessageDlg('Fehler beim Erzeugen der Zieldatei'+#13+Ziel, mtError, [mbOK], 0);
      Result := FALSE;
    END;
    TRY
      TRY
        T.CopyFrom( S, S.Size );
        FileSetDate( T.Handle, FileGetDate( S.Handle ) ) ;
        { Dateizeit setzen }
      EXCEPT
        Screen.Cursor := crDefault;
        MessageDlg('Fehler beim Kopieren der Zieldatei'+#13+Ziel, mtError, [mbOK], 0);
        Result := FALSE
      END;
    FINALLY
      T.Free
    END;
  FINALLY
    S.Free
  END
END;
2.:
Delphi-Quellcode:
CopyFile(PChar(Quelldatei), PChar(Zieldatei), FailIfExists);
3.:
Delphi-Quellcode:
function TtfMain.FileOperation(QuellDatei:string;Zielverz:string;Action:integer):boolean;
var Operation : TSHFileOpStruct;
    i        : integer;
begin
  with Operation do begin
    {Parent Window}
    wnd:=Application.Handle;
    {was soll gemacht werden?}
    wFunc:=Action;

    {Quelldateien nach pFrom kopieren}
    pFrom:=PChar(QuellDatei+#0);

    {Zielverzeichnis nach pTo kopieren}
    pTo:=PChar(ZielVerz+#0);

    {Titel der Fortschrittanzeige}
    case Action of
      FO_Delete : lpszProgressTitle:='Dateien löschen';
      FO_Copy  : lpszProgressTitle:='Dateien kopieren';
      FO_Move  : lpszProgressTitle:='Dateien verschieben';
      FO_Rename : lpszProgressTitle:='Dateien umbenennen';
    end;
{   Flags für die Aktion einstellen

    ohne Fortschrittanzeige:
    fFlags:=FOF_AllowUndo or FOF_Silent;

    ohne Bestätigung :
    fFlags:=FOF_AllowUndo or FOF_NoConfirmation

    z.B. klammheimlich in den Papierkorb verschieben:
    fFlags:=FOF_AllowUndo or FOF_Silent or FOF_NoConfirmation}

    fFlags:=FOF_NoConfirmation or FOF_Silent;
  end;

  {Und los gehts!}
  Result:=SHFileOperation(Operation)=0;
end;
4.:
Delphi-Quellcode:
procedure TtfMain.MemoryStreamCopy(Von,Nach : string);
var
  mem : TMemoryStream;
  FilePathA, FilePathB : String;
begin
  FilePathA := Von; // Pfad der zu kopierenden Datei
  FilePathB := Nach; // Zielpfad
  mem := TMemoryStream.Create;
  try
    mem.LoadFromFile(filePathA);
    mem.SaveToFile(FilepathB);
  finally
    mem.Free;
  end;
end;
5.:
Delphi-Quellcode:
jclfileutils.FileCopy(Quelldatei,Zieldatei,True);  //Eine Funktion der JCL
mich würde jetzt interessieren, ob ihr noch mehr Mothoden kennt eine Datei zu kopieren?

Wäre echt toll wenn ich die hier reinposten würdet!

Vielen Dank

:angel:

-=wWw=- AK23 9. Feb 2006 13:00

Re: Verschiedene Möglichkeiten zum Verschieben von Dateien
 
das klingt echt gut.
ich glaub das hat das zeug für die codelibrary..

zu deiner frage, nein ich wusste noch nicht einmal wie das genau geht. :cry:

Angel4585 9. Feb 2006 13:02

Re: Verschiedene Möglichkeiten zum Verschieben von Dateien
 
Naja, für die Codelib ist es bissl zu viel Copy&Paste :zwinker:
und zuviel Rechtschreibfehler, aber falls jemand mehr Methoden kennt bitte posten

Khabarakh 9. Feb 2006 13:10

Re: Verschiedene Möglichkeiten zum Verschieben von Dateien
 
Wozu brauchst du mehrere Möglichkeiten für ein und dieselbe Aktion :gruebel: ? Zumal das ExceptionHandling im ersten Code ziemlich mies und sogar fehlerhaft ist, Nummer 5 wird wohl auch einfach nur #2 aufrufen (hab nicht nachgeschaut, also ohne Gewehr und Munition).
2. und 3. reichen doch vollkommen.

ichbins 9. Feb 2006 13:12

Re: Verschiedene Möglichkeiten zum Verschieben von Dateien
 
Kopieren über file-of-byte:
Delphi-Quellcode:
var
  f,t:file of byte;
  buf:array[0..4095] of byte;
  readbytes:integer;
begin
  try begin
    assignfile(f,VON);
    reset(f);
    try begin
      assignfile(t,NACH);
      rewrite(t);
      while not eof(f) do begin
        blockread(f,buf,length(buf),readbytes);
        blockwrite(t,buf,readbytes);
      end;
      closefile(t);
    end except
      try closefile(t) except end;
    end;
    closefile(f);
  end except
    try closefile(f) except end;
  end;
end;

Angel4585 9. Feb 2006 13:14

Re: Verschiedene Möglichkeiten zum Verschieben von Dateien
 
Es könnte ja einfach mal sehr interessant sein zu sehen, was für Möglichkeiten einem geboten werden um an ein Ziel zu kommen, ausserdem möchte ich die verschiedenen Methoden miteinander vergleichen, um die schnellste davon auszuwählen. Deswegn brauch ich ein paar verschiedene

@ ichbins:
Danke... :oops: ich hab die schon.. nur vergessen zu posten, trotzdem Danke!

meine sieht übrigens so aus:
Delphi-Quellcode:
function TtfMain.CopyAssignFile(AVon,ANach :string):Boolean;
var
 fq,fz : file of byte;
 b : array [1..8192] of Byte;
 lread : integer;
begin
Result:=True;
try
 try
 AssignFile(fq,AVon);
 AssignFile(fz,ANach);
 Reset(fq);
 Rewrite(fz);
 while not eof(fq) do
  begin
  BlockRead(fq,b,Length(b),lread);
  BlockWrite(fz,b,lread);
  end;
 finally
  CloseFile(fq);
  CloseFile(fz);
  end;
except
 Result:=False;
 end;
end;

ichbins 9. Feb 2006 13:17

Re: Verschiedene Möglichkeiten zum Verschieben von Dateien
 
Zitat:

Zitat von Angel4585
Delphi-Quellcode:
try
try

was soll das bitte bezwecken? er versucht zu versuchen die Datei zu assignen, und ein except gibt's nicht... :gruebel: fehlt da nicht ein begin?

-=wWw=- AK23 9. Feb 2006 13:18

Re: Verschiedene Möglichkeiten zum Verschieben von Dateien
 
was mich jetzt mal interresieren würde, ist ob es in den verschiedenen methoden
zu unterschieden in der geschwindigkeit kommt.

Angel4585 9. Feb 2006 13:19

Re: Verschiedene Möglichkeiten zum Verschieben von Dateien
 
das geht so.. BASTA!!

Khabarakh 9. Feb 2006 13:20

Re: Verschiedene Möglichkeiten zum Verschieben von Dateien
 
Zitat:

Es könnte ja einfach mal sehr interessant sein zu sehen, was für Möglichkeiten einem geboten werden um an ein Ziel zu kommen, ausserdem möchte ich die verschiedenen Methoden miteinander vergleichen, um die schnellste davon auszuwählen. Deswegn brauch ich ein paar verschiedene
Es würde mich schwer wundern, wenn es eine bessere Methode als über die Win-API gäbe.

H4ndy 9. Feb 2006 13:22

Re: Verschiedene Möglichkeiten zum Verschieben von Dateien
 
Da ich mir spontan keine weitere Methode einfällt, geb ich mal einen Kommentar ab:
Ich würde Nr. 2 favorisieren, da dort alles auf Windows-Ebene vonstatten geht.

Die MemoryStream-Methode (Nr. 4) lehne ich sehr ab, da diese
a) Von der Natur des MemoryStreams her Speicher förmlich "frisst"
b) Langsam ist (Windows beginnt schon bei wenigen MB mit Paging [bremst den Einlesevorgang erheblich])

Angel4585 9. Feb 2006 13:23

Re: Verschiedene Möglichkeiten zum Verschieben von Dateien
 
Also die MemoryStream Methode wird ab bestimmten Dateigrößen sehr lahm der Rest ist bisher gut gelaufen. am schnellsten war bisher die QuickCopy geschichte, also das Erste.

Edit
@H4ndy: Windows ist nicht immer gut :zwinker:

Nachtrag zur MemoryStream Methode: bei kleine Dateien bis ca. 30 MB ist das(auf meinem Rechner) die schnellste Methode.

H4ndy 9. Feb 2006 13:29

Re: Verschiedene Möglichkeiten zum Verschieben von Dateien
 
Zitat:

Zitat von Angel4585
@H4ndy: Windows ist nicht immer gut :zwinker:

Man kann ja nicht alles haben ;)
Ist aber IMHO die Methode, wo die wenigsten Fehler passieren können.

Wer mehr Kontrolle über den Kopiervorgang braucht, kann ja #1 benutzen.
(Mit nem Block-Lese Algorithmus ist ein Fortschrittsbalken kein Problem)

Angel4585 9. Feb 2006 13:34

Re: Verschiedene Möglichkeiten zum Verschieben von Dateien
 
Neue und bisher schnellste(!!!!100000 ms wo andere 160000ms brauchen!!!!) Methode:

Delphi-Quellcode:
function TtfMain.StreamCopy(AVon, ANach : string): Boolean;
var
 stream1,stream2 : TStream;
begin
stream1 := TFileStream.Create(AVon, fmOpenRead);
try
  stream2:= TFileStream.Create(ANach, fmCreate);
  try
    stream2.CopyFrom(Stream1, Stream1.Size);
  finally
    stream2.Free;
  end;
finally
  stream1.Free;
  end;
end;
Edit: UUps : das ist Methode 1 nur ohne try except Block(verlier grad bissl den Überblick.. aber warum ist die so schnell???
Edit2: :shock: noch ein Vergleich von 1 und 7 ... beid liegen bei ca 82000... :gruebel: was ist mit meinem Rechner los?? Die anderen brauchen ewig...

-=wWw=- AK23 9. Feb 2006 13:49

Re: Verschiedene Möglichkeiten zum Verschieben von Dateien
 
Wegen dem Speedtest.

Beende mal alle unötigen prozesse und sag uns mal was du für eine Hardware verwendest.

und wenn du noch so nett wärest ein speed-tester für andere zu machen... :P

Angel4585 9. Feb 2006 14:12

Re: Verschiedene Möglichkeiten zum Verschieben von Dateien
 
Liste der Anhänge anzeigen (Anzahl: 1)
OK hier hab ich mal das Prog.

Warnung: Benutzung auf eigene Gefahr, ich übernehme keinerlei Haftung für aufkommende Schäden :mrgreen:
(Das Programm ist so verbuggt, da musste ich das einfach dazuschreiben)

H4ndy 9. Feb 2006 14:22

Re: Verschiedene Möglichkeiten zum Verschieben von Dateien
 
Zitat:

Zitat von Angel4585
aber warum ist die so schnell???
Edit2: :shock: noch ein Vergleich von 1 und 7 ... beid liegen bei ca 82000... :gruebel: was ist mit meinem Rechner los?? Die anderen brauchen ewig...

Das direkte Vergleichen ist immer so eine Sache bei Dateioperationen.
Windows ist nämlich nicht doof und führt einen prefetch durch.
Wenn du ein und die selbe Datei zwei mal hintereinander kopierst,
wird der zweite Kopiervorgang bei 99,99%iger Wahrscheinlichkeit
schneller sein wie der erste. (Zumindest bei meinen Beobachtungen)

-=wWw=- AK23 9. Feb 2006 15:06

Re: Verschiedene Möglichkeiten zum Verschieben von Dateien
 
OK, ich hab das jetzt getestet.

der 2. versuch IST schneller, da die datei dann schon / noch
im cache liegt.

Für 135.168 Bytes brauch ich bei (Schnellster- /langsamster Versuch):
  • Quickcopy: 31 / 63 MS
  • Copyfile: 29 / 89 MS
  • Fileoperation: 31 / 83 MS
  • Memorystream: 68 / 94 MS
  • JCL Filecopy: 31 / 47 MS
  • AssignFile: 63 / 98 MS
  • Streamfile: 78 / 156 MS

Meine Configs sind:
ASRock K7VT4A+ (größter mist wo gib);
AMD Athlon XP 3000+;
1 GB DDR Ram;
Maxtor 120 GB (7.200 u) IDE;
und Windows XP SP 2.

H4ndy 9. Feb 2006 15:15

Re: Verschiedene Möglichkeiten zum Verschieben von Dateien
 
Ich glaube, die Tests sollten lieber mit großen Dateien durchgeführt werden,
weil dann die Schwankungen nicht bis zu 50% von der Gesammtzeit ausmachen :?

@Angel4585
Desweiteren würde mich mal interessieren, welche Zeitmessroutine du genommen hast.
GetTickCount könnte hier ungenau werden. Besser wäre hier ein PerformanceCounter.

Edit:
Habs mal selber getestet
Datei: xampp-win32-1.5.1-installer.exe (30.424.567 Bytes, ~29MB)
Virenscanner ist AUS
System: PIII 800MHz, 512MB RAM, WinXP SP2
(Alles Durchschnittswerte nach 4 Versuchen)

QuickCopy: ~1389ms
CopyFile: ~1246ms
FileOperation: ~1284ms
MemoryStream: ~1742ms
JCLFielCopy: ~1238ms
AssignFile: ~2491ms
StreamCopy: ~1312ms


Wie man sieht, sind nur MemoryStream und AssignFile wirklich langsamer
als die anderen Methoden. Desweiteren hab ich Schwanker von bis zu 400ms dabei gehabt.
(Einmal dauerte es sogar nur ~550ms...)

Ich denke mal es ist einfach ne Glaubensfrage, welchen Algo man nimmt ^^

Angel4585 10. Feb 2006 07:37

Re: Verschiedene Möglichkeiten zum Verschieben von Dateien
 
Also ich verschieb ne Datei mit 1 GB

und brauche im Schnitt ca 80000 ms für jede der Varianten, ich glaub die Unterschiede kamen nur daher das der Rechner gestern irgendwie gesponnen hat.

Edit: Memory Stream ausgenommen, die braucht 10 mal so lang bei so großen Dateien :!:

-=wWw=- AK23 13. Feb 2006 17:10

Re: Verschiedene Möglichkeiten zum Verschieben von Dateien
 
Zitat:

Zitat von Angel4585
Hallo zusammen,
2.:
Delphi-Quellcode:
CopyFile(PChar(Quelldatei), PChar(Zieldatei), FailIfExists);

ich hab mir das mal geklaut :P
bekomme allerdings folgende Fehlermeldung:

Zitat:

Zitat von Delphi Debugger
[Error] Unit1.pas(145): Undeclared identifier: 'FailIfExists'

EDIT:
:oops: :oops:
Hab die lösung für mein problem:
FailIfExists=False bzw. True


Alle Zeitangaben in WEZ +1. Es ist jetzt 03:16 Uhr.

Powered by vBulletin® Copyright ©2000 - 2025, Jelsoft Enterprises Ltd.
LinkBacks Enabled by vBSEO © 2011, Crawlability, Inc.
Delphi-PRAXiS (c) 2002 - 2023 by Daniel R. Wolf, 2024-2025 by Thomas Breitkreuz