ich habe eine unangenehme Überraschung bei der Verwendung von temporären Dateien erlebt und dachte, ich teile die Erfahrung hier mal.
Ich habe hier im Computer unter Windows 10 nur eine Festplatte als Laufwerk C: (NTFS), darauf ist auch der Webserver XAMPP installiert, und das Verzeichnis
Code: Alles auswählen
c:\xampp\htdocs\mysite\
Kürzlich habe ich als Benutzer "Nino" mit einem PB-Programm HTML-Dateien in dem Verzeichnis geändert. Dabei bin ich bei jeder Datei so vorgegangen:
- Inhalt der Originaldatei nach und nach in Strings lesen.
- Jeweils gewünschte Änderungen an den Strings vornehmen und diese in eine temporäre Datei im %temp%-Verzeichnis des aktuellen Benutzers schreiben; also in dem Verzeichnis das die PB-Funktion GetTemporaryDirectory() liefert.
- Beide Dateien schließen.
- Originaldatei löschen.
- Temporäre Datei in Originaldatei umbenennen.
Nur musste ich später feststellen, dass ich die so geänderten Dateien unter einem anderen Benutzerkonto nicht einmal zum Lesen öffnen konnte!
Damit hatte ich nicht gerechnet, denn wie gresagt ist
Code: Alles auswählen
c:\xampp\htdocs\mysite\
Offenbar hatten die Dateien die Zugriffsrechte behalten, die für das %temp%-Verzeichnis des Benutzers "Nino" gelten. Dort waren sie ja erzeugt, und später "nur noch" verschoben worden.
Inzwischen habe ich Hintergrundinformationen zu diesem Problem gefunden, das offenbar nicht nur mich irritiert hat. Die auf dieser Seite getroffene Feststellung, dass Microsofts neue Regeln ab Windows Vista zur Lösung des Problems nicht immer funktionieren, kann ich nur bestätigen. Denn bei mir läuft Windows 10.
Mit dem folgenden vereinfachten Code lässt sich das Problem reproduzieren.
Code: Alles auswählen
; Windows 10 (Dateisystem NTFS), PB 5.61
; Programm ausgeführt unter Account ganz ohne oder mit eingeschränkten Administratorrechten
EnableExplicit
Procedure Create (file$)
If CreateFile(0, file$)
WriteStringN(0, "<!DOCTYPE html>")
WriteStringN(0, "<html lang='de'>")
CloseFile(0)
EndIf
EndProcedure
Procedure Rename1 (file$)
; Das temporäre Verzeichnis ist immer auf Laufwerk C:.
Protected tempFile$ = GetTemporaryDirectory() + GetFilePart(file$)
Create(tempFile$)
RenameFile(tempFile$, file$)
EndProcedure
Procedure Rename2 (file$)
Protected tempFile$ = file$ + ".tmp"
Create(tempFile$)
RenameFile(tempFile$, file$)
EndProcedure
Define target$ = "c:\xampp\htdocs\mysite\<User>" ; <=== <User> anpassen #####
; möglicher Zugriff auf Zieldatei unter anderem Account
; (ganz ohne oder mit eingeschränkten Administratorrechten)
; ---------------------------------------------------------
Create (target$ + ".htm") ; lesen und schreiben
Rename1(target$ + "_r1.htm") ; * nicht einmal lesen *
Rename2(target$ + "_r2.htm") ; lesen und schreiben
Wenn beim Bearbeiten einer Datei eine temporäre Datei erzeugt wird die später in die Ursprungsdatei umbenannt werden soll, so sollte sie wegen der Zugriffsrechte nicht im %temp%-Verzeichnis erzeugt werden, sondern wohl am besten in dem Verzeichnis in dem sich die Ursprungsdatei befindet.