Die Aufforderung an Reset
führt dazu, dass die Datei zum Schreiben geöffnet wird. Das liegt daran, dass der Standardwert von System.FileMode
es fmOpenReadWrite
. Da Ihre Anwendung virtualisiert ausgeführt wird und Ihr Benutzer-Token keine Administratorrechte hat, greift die Virtualisierungsschicht ein und erstellt eine Kopie der Datei im virtuellen Speicher.
Die Lösung, die bei der Verwendung von Legacy-Pascal-I/O verfügbar ist, besteht darin, die FileMode
a fmOpenRead
. Dann Reset
wird die Datei zum Lesen geöffnet und die Virtualisierungsschicht wird nicht aufgerufen.
Denken Sie daran, dass FileMode
ist eine globale Variable, die alle Legacy-Pascal-E/A beeinflusst. Wehe, wenn Sie Threads haben, oder vergessen, die Variable FileMode
zurück zu fmOpenReadWrite
wenn Sie eine Datei schreiben müssen. Widerlich, nicht wahr? Prozessweite globale Flags zur Steuerung des Dateizugriffsmodus! Nun, dieses Zeug wurde erfunden, lange bevor Anwendungen Threads hatten. Und lange bevor OOP erfunden wurde. Ich kann also verstehen, warum das so ist.
Daraus lässt sich die Lehre ziehen, dass es an der Zeit ist, auf eine der modernen Formen des Dateizugriffs umzusteigen. Zum Beispiel, TFileStream
.
In der Tat ist es auch an der Zeit, die Virtualisierung in Ihrer Anwendung zu deaktivieren. Die Virtualisierung wurde vor fast 6 Jahren mit Vista eingeführt. Sie war als Hilfe für alte Programme gedacht, die noch nicht für Vista neu kompiliert worden waren. Ihre Anwendung sollte sie nicht mehr verwenden.