Discussion:
Dateien kopieren
(zu alt für eine Antwort)
Markus Kottenhahn
2003-08-18 05:09:40 UTC
Permalink
Bin mal wieder auf der Suche... :-)

Ich möchte einfach eine Binärdatei kopieren. So eine rudimentäre
Backup-Routine, die aber nicht vorhaben soll, den Streamer zu ersetzen.

Nur, wie? In der OH hätte ich ja eigentlich eine schöne Funktion wie
CopyFile(Src, Dest) erwartet, aber Fehlanzeige.

Wichtig wäre mir, dass die Aktion in einer einigermaßen angemessenen
Zeit vonstatten geht, die Datei ist mitunter mehrere MB groß. Ein
simples Experimentieren mit byteweise Einlesen und neu schreiben wollte
mein Rechner nicht schlucken, und ein

cmd.exe /c copy datei.exe .\Backup\datei.ext

ist ja auch nicht unbedingt elegant (wenngleich es seinen Zweck
erfüllt).

Hat da wer zufällig was auf Lager?

Achja: Es handelt sich um eine Access-Datenbank (nur am Rande), bei der
ich aber zum Zeitpunkt des Sicherns davon ausgehen kann, dass sie
geschlossen ist, und auch kein anderer Rechner auf sie zugreift.
--
(Markus) Mickey Kottenhahn
Rolf-Dieter Werner
2003-08-18 06:13:36 UTC
Permalink
"Markus Kottenhahn" schrieb
[...]
Post by Markus Kottenhahn
Ich möchte einfach eine Binärdatei kopieren. So eine rudimentäre
Backup-Routine, die aber nicht vorhaben soll, den Streamer zu ersetzen.
Nur, wie? In der OH hätte ich ja eigentlich eine schöne Funktion wie
CopyFile(Src, Dest) erwartet, aber Fehlanzeige.
[...]
Sie dir doch mal
http://www.delphicity.net/catalogue/collections/tools/tfileoperation/ an.
Dieses Objekt benutzt die Funktionen der shell32.dll.
Ich benutze es regelmäßig und IMHO funktioniert es hervorragend.
Gruß Rolf
Bjoern Schreiber
2003-08-18 06:42:43 UTC
Permalink
Post by Markus Kottenhahn
Hat da wer zufällig was auf Lager?
Schlag mal CopyFile in der WIN32-API nach (Tipp: nicht nur in der
Delphi-Hilfe stöbern ;-)).
Ansonsten fällt mir noch SHFileOperation ein, welche ggf. automatisch
einen Fortschrittsbalken einblendet -- vorteilhaft bei längeren
Kopieroperationen.


HTH,
Björn
--
Björn Schreiber, DRIGUS GmbH
***@drigus.de
Bei Email NOSPAM in den Betreff aufnehmen.
Put NOSPAM in subject to reach me by email.
Jens Serman
2003-08-18 06:55:24 UTC
Permalink
Moin,
ich nutze dafür

FUNCTION FileCopy(source, dest: SHORTSTRING): Boolean;
VAR
fSrc, fDst, len: Integer;
size: Longint;
buffer: PACKED ARRAY[0..2047] OF Byte;
BEGIN
Result := False; { Assume that it WONT work }
IF source <> dest THEN BEGIN
fSrc := FileOpen(source, fmOpenRead);
IF fSrc >= 0 THEN BEGIN
size := FileSeek(fSrc, 0, 2);
FileSeek(fSrc, 0, 0);
fDst := FileCreate(dest);
IF fDst >= 0 THEN BEGIN
WHILE size > 0 DO BEGIN
len := FileRead(fSrc, buffer, sizeof(buffer));
FileWrite(fDst, buffer, len);
size := size - len;
END;
FileSetDate(fDst, FileGetDate(fSrc));
FileClose(fDst);
FileSetAttr(dest, FileGetAttr(source));
Result := True;
END;
FileClose(fSrc);
END;
END;
END;


Passend für Acces Dateien :

PROCEDURE Access_Compact(aAccess: shortstring);stdcall;
VAR
JetEngine: Variant;
TempName: STRING;
BEGIN
TempName := ChangeFileExt(aAccess, bak_ext);
DeleteFile(TempName);
JetEngine := CreateOleObject('JRO.JetEngine');
TRY
JetEngine.CompactDatabase(
Format(stAccessDB, [aAccess]),
Format(stAccessDB, [TempName]));
DeleteFile(aAccess);
RenameFile(TempName, aAccess);
FINALLY
JetEngine := Unassigned;
END;
END;

Komprimiert die DB, würde ich vorm Kopieren machen

HTH

Jens
Jens Serman
2003-08-18 06:57:32 UTC
Permalink
Böses Copy&Paste:
PROCEDURE Access_Compact(aAccess: shortstring);
Das stdcall; kommt daher das ich es in ner DLL liegen habe, also ohne
stdcall; der Header


Grüsse

Jens

Lesen Sie weiter auf narkive:
Loading...