Datei kopieren: "Unable to open File"

Für Fragen zur Programmiersprache auf welcher Lazarus aufbaut
Antworten
kmayse
Beiträge: 31
Registriert: Mo 16. Jan 2012, 11:24
OS, Lazarus, FPC: Win7 (L 0.9.31 FPC 2.5.1)
CPU-Target: 32Bit
Wohnort: Tübingen

Datei kopieren: "Unable to open File"

Beitrag von kmayse »

Hallöchen,
ich habe ein Problem. In meine Datenbankanwendung will ich eine "Backup-Funktion" einbauen, sprich: Die aktuelle Datenbank soll an einen vom User per SaveDialog ausgewählten Pfad kopiert werden. Ich versuche, das folgendermaßen zu realisieren:

[delphi]procedure CopyFile(ASource, ADest: string);
var
s, d: TFileStream;
begin
s := TFileStream.Create(ASource, fmOpenRead or fmShareDenyWrite);
try
d := TFileStream.Create(ADest, fmCreate or fmShareExclusive);
try
d.CopyFrom(s, 0);
finally
d.Free;
end;
finally
s.Free;
end;
end;[/delphi]

Die Backup-Button Prozedur sieht dann so aus:

[delphi]var
FilePathA, FilePathB : string;
begin
FilePathA:= 'C:\Users\kmayse\AppData\Local\meinprog\data\datenbank.db'; //Dateipfad
Savedialog.FileName:='Datenbank-Backup.db';
SaveDialog.Execute;
FilePathB := Savedialog.FileName; // Zielpfad
CopyFile(FilePathA, FilepathB);
end;[/delphi]

Doch das funktioniert nicht. Ich bekomme dann, wenn der Kopiervorgang stattfinden sollte (nach dem Schließen des Savedialogs) die Fehlermeldung: "Unable to open file [Dateipfad]". Mit GetLastOSError gibt er mir 6 aus. Ich habe schon im Internnet gesucht, doch die dort einschlägigen Lösungen für das Problem helfen bei mir nicht:
1. Die Datei ist nirgends geöffnet, außer in meinem eigenen Programm (zum Test habe ich es mit einer *.txt-Datei versucht, die tatsächlich NIRGENDWO geöffnet war, auch das ging nicht)
2. Die Datei existiert. Der Pfad stimmt (er ist direkt aus dem Explorer kopiert).

Nachtrag:
Ich habe es gerade mit einer pdf-Datei versucht, die in einem ordner direkt auf C liegt. Sprich: FilePathA war c:\EinOrdner\EinePdf.pdf. Da hat es funktioniert... Aber obiger dateipfad stimmt unzweifelhaft, ich hab ihn aus Lazarus nochmal rauskopiert und in die Explorer-Adressleiste eingegeben, dann öffnet sich die gewünschte datei...!?!

Woran könnte das noch liegen?

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

Re: Datei kopieren: "Unable to open File"

Beitrag von theo »

Gibt es einen Grund, warum du eine eigene Kopier-Prozedur schreibst?

Warum nimmst du nicht die function CopyFile in unit FileUtil?

kmayse
Beiträge: 31
Registriert: Mo 16. Jan 2012, 11:24
OS, Lazarus, FPC: Win7 (L 0.9.31 FPC 2.5.1)
CPU-Target: 32Bit
Wohnort: Tübingen

Re: Datei kopieren: "Unable to open File"

Beitrag von kmayse »

Ja, weil auch das nicht funktioniert hat.
[delphi]if CopyFile(FilePathA,FilePathB,true) then
showmessage('ok')
else
showmessage(IntToStr(GetLastOSError));[/delphi]

--> gibt immer "6" aus.

Benutzeravatar
m.fuchs
Lazarusforum e. V.
Beiträge: 2822
Registriert: Fr 22. Sep 2006, 19:32
OS, Lazarus, FPC: Winux (Lazarus 2.0.10, FPC 3.2.0)
CPU-Target: x86, x64, arm
Wohnort: Berlin
Kontaktdaten:

Re: Datei kopieren: "Unable to open File"

Beitrag von m.fuchs »

Bei dem Fehler Das Handle ist ungültig würde ich auch nach einem Berechtigungsproblem suchen. Bzw. (du hast vermutlich Windows 7) könnte es auch an den komischen Pfaden liegen, die dort eingebaut wurden. Heißt "C:\Users" wirklich so wie im Explorer angezeigt? Irgendwas wird doch da gemappt.
Software, Bibliotheken, Vorträge und mehr: https://www.ypa-software.de

kmayse
Beiträge: 31
Registriert: Mo 16. Jan 2012, 11:24
OS, Lazarus, FPC: Win7 (L 0.9.31 FPC 2.5.1)
CPU-Target: 32Bit
Wohnort: Tübingen

Re: Datei kopieren: "Unable to open File"

Beitrag von kmayse »

mmhh... also Ich lese die Datenbank ja zu Programmstart von genau diesem Pfad ein. Da funktioniert das ohne Probleme, da gibt es auch keine Berechtigungs-Konflikte...

kmayse
Beiträge: 31
Registriert: Mo 16. Jan 2012, 11:24
OS, Lazarus, FPC: Win7 (L 0.9.31 FPC 2.5.1)
CPU-Target: 32Bit
Wohnort: Tübingen

Re: Datei kopieren: "Unable to open File"

Beitrag von kmayse »

Also, ich habe die Lösung gefunden, glaube ich. Es war tatsächlich ein Berechtigungsproblem. Die Datenbank wird ja beim Programmstart ins Programm geladen, und das war das Problem. Ich musst vor dem Kopiervorgang die Verbindung zur Datenbank trennen, dann die Datei kopieren, und anschließend die Verbindung wieder herstellen. Das scheint nun zu funktionieren.

Herzlichen Dank für die Anregungen!

LG

Antworten