77 Stimmen

Lazarus: Datei kopieren, die gerade benutzt wird

Artikel von Stefan Trost | Letztes Update am 27.12.2022 | Erstellt am 22.08.2014

Wenn wir eine Datei gerade mit einem Programm wie zum Beispiel OpenOffice, Word oder einem anderen Programm geöffnet haben, markiert das Programm diese Datei als "gerade in Benutzung".

Wenn wir nun eine solche Datei mit der Funktion CopyFile von Lazarus kopieren möchten, bekommen wir die Fehlermeldung "Unable to open file". Trotzdem ist es unter Windows möglich mit STRG + C und STRG + V besagte Datei zu kopieren, obwohl sie eigentlich durch das Programm gesperrt sein müsste.

Wie kann es sein, dass das Kopieren in Windows funktioniert, nicht aber in Lazarus? Und wie können wir dieses Verhalten ändern?

FileOpenUTF8 - fmShareDenyNone oder fmShareDenyWrite

Folgen wir der CopyFile-Funktion zu ihrer Definition in der Unit "FileUtil", sehen wir wo der Fehler liegt. Hier finden wir folgende Zeile beim Lesen der Datei:

SrcHandle := FileOpenUTF8(SrcFilename, fmOpenRead or fmShareDenyWrite);

Das fmShareDenyWrite sorgte dafür, dass das Recht eingefordert wird, den alleinigen Schreibzugriff auf die Datei zu erhalten. Damit wird verhindert, dass eine andere Anwendung in die Datei schreiben kann. Andere Programme sollen die Datei nur noch zum Lesen öffnen dürfen.

Genau hier liegt aber unser Problem. Dadurch dass wir beim Kopieren der Datei das alleinige Recht einfordern, gibt uns das Betriebssystem eine Fehlermeldung zurück, wenn die Datei bereits durch eine andere Anwendung geöffnet ist (denn dann können wir dieses Recht nicht einfordern).

Benutzen wir stattdessen fmShareDenyNone, geht es:

SrcHandle := FileOpenUTF8(SrcFilename, fmOpenRead or fmShareDenyNone);

Mit fmShareDenyNone wird sowohl das Lesen als auch das Schreiben durch andere Anwendungen nicht verhindert und das Kopieren funktioniert selbst dann, wenn die Datei in anderen Programmen geöffnet ist.

Sollte man die Originalfunktion ändern?

Trotzdem sollte man bei einer derartigen Änderung etwas Vorsicht walten lassen und zumindest bedenken, dass es mit dem ursprünglichen fmShareDenyWrite nicht möglich ist, dass andere Anwendungen während des Kopiervorgangs die Quelldatei verändern. Mit fmShareDenyNone dagegen schon.

Es wäre also anzuraten, nicht die Originalfunktion zu verändern sondern eine eigene Funktion mit dieser Änderung zu implementieren, die nur dann benutzt wird, wenn man genau dieses Verhalten benötigt.

AntwortenPositivNegativ

Über den Autor

AvatarSoftware von Stefan Trost finden Sie auf sttmedia.de. Benötigen Sie eine individuelle Software nach Ihren eigenen Wünschen? Schreiben Sie uns: sttmedia.de/kontakt
Profil anzeigen

 

Ähnliche Themen

Delphi: Systemweiter HotKey

Tutorial | 3 Kommentare

Wichtiger Hinweis

Bitte beachten Sie: Die Beiträge auf askingbox.de sind Beiträge von Nutzern und sollen keine professionelle Beratung ersetzen. Sie werden nicht von Unabhängigen geprüft und spiegeln nicht zwingend die Meinung von askingbox.de wieder. Mehr erfahren.

Jetzt mitmachen

Stellen Sie Ihre eigene Frage oder schreiben Sie Ihren eigenen Artikel auf askingbox.de. So gehts.