Datei von Dir A nach Dir B kopieren

Für Fragen von Einsteigern und Programmieranfängern...
Antworten
DL3AD
Beiträge: 478
Registriert: Fr 13. Sep 2013, 12:07
OS, Lazarus, FPC: Debian Bullseye (L 2.2.0)
CPU-Target: 64Bit
Wohnort: Rügen

Datei von Dir A nach Dir B kopieren

Beitrag von DL3AD »

Hallo,

ich habe eine Vorlagedatei als Basis z.B. vorlage.db3
Nun möchte ich z.B. eine Kopie dieser vorlage.db3 als NewLog.db3 abspeichern.
Mit welcher Komponente kann man eine Datei kopieren ?
Das abspeichern sollte dann mit einem SaveDialog funktionieren ?

Gruß
Frank

Benutzeravatar
theo
Beiträge: 10467
Registriert: Mo 11. Sep 2006, 19:01

Re: Datei von Dir A nach Dir B kopieren

Beitrag von theo »

Eine Komponente braucht man dazu nicht.

http://wiki.lazarus.freepascal.org/CopyFile

Code: Alles auswählen

If SaveDialog1.Execute then CopyFile(QuellDateiName,SaveDialog1.FileName);     

DL3AD
Beiträge: 478
Registriert: Fr 13. Sep 2013, 12:07
OS, Lazarus, FPC: Debian Bullseye (L 2.2.0)
CPU-Target: 64Bit
Wohnort: Rügen

Re: Datei von Dir A nach Dir B kopieren

Beitrag von DL3AD »

... Danke theo

habe folgendes versucht

Code: Alles auswählen

procedure TForm1.Button1Click(Sender: TObject);
begin
  CopyFile('\Master\adlogclear.db3','\Datenbank\adlogclear.db3');
 end;       

funktioniert aber nicht :(
Ich möchte keinen absoluten Bezug wie C:\... angeben - unter dem Projektverzeichnis sind Quell- und Zielverzeichnis gelegen
Das ganze soll unter Win und Linux laufen.

Benutzeravatar
gladio
Beiträge: 217
Registriert: Sa 21. Jun 2014, 06:15
OS, Lazarus, FPC: Win10-64 - aktuelle Lazarus/FPC Standard-Edition
CPU-Target: 64Bit
Wohnort: Rügen

Re: Datei von Dir A nach Dir B kopieren

Beitrag von gladio »

So wird das wohl nichts werden. Unter Linux sind die Verzeichnistrenner(?) in der pfadangabe doch '/' oder?
Ist es nicht besser der Copy-Funktion Quelle und Ziel als String zu übergeben, die vorher natürlich entsprechen ausgelesen werden müssen
etwa so

Code: Alles auswählen

 
var Quelle, Ziel : String;
 
Quelle := (ExtractFilePath(Application.ExeName)+'DeineQuellDatei');
Ziel := (ExtractFilePath(Application.ExeName)+'DeinZiel');
CopyFile(Quelle,Ziel);
 

wp_xyz
Beiträge: 4869
Registriert: Fr 8. Apr 2011, 09:01

Re: Datei von Dir A nach Dir B kopieren

Beitrag von wp_xyz »

Was funktioniert denn da nicht? Ein paar mehr Informationen wären schon hilfreich...

Vielleicht existiert das Zielverzeichnis nicht? Dann gibst du als zusätzlichen Parameter [cffCreateDestDirectory] an, falls die Zieldatei schon existiert und überschrieben werden soll auch [cffOverwiteFile].

Du kannst bei vielen Lazarus/FPC-Funktionen unter Windows auch die Linux-Slashes im Dateinamen verwenden, so auch bei CopyFile (gerade getestet). Obwohl... Ich habe Win10, und da gibt es ja diese eingebaute Linux-Umgebung... Evtl. musst du vor CopyFile noch EnforcePathDelimis(pfad) aufrufen (in LazFileUtils), das den richtigen Slash einsetzt. Ist auf jeden Fall nicht falsch...

Zum relativen Verzeichnis: Zur Laufzeit ist das Projektverzeichnis egal, sondern der Bezugspunkt ist das Exe-Verzeichnis. Den Pfad zum Exe-Verzeichnis erhältst du über Application.Location.

Code: Alles auswählen

var
  src, dest: String;
begin
  src := AppendPathDelim(Application.Location) + 'Master\adlogclear.db3';
  dest := AppendPathDelim(Application.Location) + 'Datenbank\adlogclear.db3';
  EnforcePathDelims(src);
  EnforcePathDelims(dest);
  if CopyFile(src, dest, [cffCreateDestDirectory, cffOverwriteFile]) then
    ShowMessage('Datei wurde erfolgreich kopiert') else
    ShowMessage('Kopieren fehlgeschlagen');
end;

DL3AD
Beiträge: 478
Registriert: Fr 13. Sep 2013, 12:07
OS, Lazarus, FPC: Debian Bullseye (L 2.2.0)
CPU-Target: 64Bit
Wohnort: Rügen

Re: Datei von Dir A nach Dir B kopieren

Beitrag von DL3AD »

... vielen Dank
Problem ist gelößt :)

DL3AD
Beiträge: 478
Registriert: Fr 13. Sep 2013, 12:07
OS, Lazarus, FPC: Debian Bullseye (L 2.2.0)
CPU-Target: 64Bit
Wohnort: Rügen

Re: Datei von Dir A nach Dir B kopieren

Beitrag von DL3AD »

... doch noch Problem

EnforcePathDelims ist unbekannt und LazFileUtils ist eingebunden :shock:

wp_xyz
Beiträge: 4869
Registriert: Fr 8. Apr 2011, 09:01

Re: Datei von Dir A nach Dir B kopieren

Beitrag von wp_xyz »

Oh - ein Tippfehler: Es heißt "ForcePathDelims", und das gibt es auch in Laz 1.6.x und wahrscheinlich früher.

DL3AD
Beiträge: 478
Registriert: Fr 13. Sep 2013, 12:07
OS, Lazarus, FPC: Debian Bullseye (L 2.2.0)
CPU-Target: 64Bit
Wohnort: Rügen

Re: Datei von Dir A nach Dir B kopieren

Beitrag von DL3AD »

... so nun funktioniert es unter Win und Debian.

Er sagt mir aber noch dass AppendPathDelim veraltet ist - gibt es da was neues ?

Warf
Beiträge: 1908
Registriert: Di 23. Sep 2014, 17:46
OS, Lazarus, FPC: Win10 | Linux
CPU-Target: x86_64

Re: Datei von Dir A nach Dir B kopieren

Beitrag von Warf »

Du nur am Rand, wenn das working directory gleich dem executeable path ist, kannst du auch einfach sowas verwenden:

Code: Alles auswählen

CopyFile('./Master/adlogclear.db3','./Datenbank/adlogclear.db3');


Moderne Windows versionen kommen sowohl mit /als pfadtrenner als auch mit . Bzw .. als relative pfadangaben klar. Und sofern deine Software nicht für 95 ist sollte es funktionieren

wp_xyz
Beiträge: 4869
Registriert: Fr 8. Apr 2011, 09:01

Re: Datei von Dir A nach Dir B kopieren

Beitrag von wp_xyz »

Ich muss raten, weil ich dir von dir verwendete Lazarus-Version nicht kenne. Zwischen den Units FileUtils und LazFileUtils gab es einige Transfers. Am besten nimmst du beide in "uses" auf. Ansonsten gibt es noch IncludeTrailingPathDelimiter in SysUtils mit derselben Function.

Antworten