Delphi-PRAXiS

Delphi-PRAXiS (https://www.delphipraxis.net/forum.php)
-   Win32/Win64 API (native code) (https://www.delphipraxis.net/17-win32-win64-api-native-code/)
-   -   Delphi Schreibzugriff Datei prüfen (https://www.delphipraxis.net/204713-schreibzugriff-datei-pruefen.html)

zeras 21. Jun 2020 08:03

Schreibzugriff Datei prüfen
 
Guten Morgen,

wir haben ein Programm in einem Pfad auf dem Netz liegen. Dort gehören auch einige Ini Dateien dazu, die im selben Pfad liegen. Nun soll nicht jeder die Ini Dateien ändern können. Deshalb hat der Pfad nur für einige Mitarbeiter Schreibrechte.
Wie kann ich im Programm abfangen, dass dort nur die Admins schreiben dürfen?
Geht das auch mit
Delphi-Quellcode:
FileIsReadOnly
, wenn "nur" der Pfad schreibgschützt ist? Oder muss ich eine andere Funktion nutzen?

himitsu 21. Jun 2020 08:31

AW: Schreibzugriff Datei prüfen
 
garnicht.

Diese Funktion prüft keine Rechte, sondern nur das Schreibschutz-Attribut und die Auswertung dieses Attributets muß das Programm selbst machen.
Delphi-Referenz durchsuchenfaReadOnly, bzw.https://docs.microsoft.com/en-us/win...bute-constants
Heißt, wenn du in die Datei schreiben willst und vorher nicht FileIsReadOnly prüfst, dann wird dennoch geschrieben. (so lange die Rechte ausreichen)


Umständliche Lösung: SecurityDescroptoren der Datei/Verrzeichnisse auswerten.

Einfache Lösung: Einfach versuchen zum Schreiben zu öffnen, wenn es nicht geht, dann fehlt das Recht (oder die Datei ist bereits geöffnet).

zeras 23. Jun 2020 18:11

AW: Schreibzugriff Datei prüfen
 
Jetzt habe ich folgendes eingebaut:

Delphi-Quellcode:
Function FolderWritable(fDir: String): Boolean;
var
  fName : String;
  FS : TFileStream;

begin
  result := false;
  fName := IncludeTrailingPathDelimiter(ExtractFilePath(fDir)) + 'test.tmp';

  FS := TFile.Create(fName);
  try
    result := true;
  finally
    FS.Free;
  end;
  if TFile.Exists(fName) then begin
    TFile.Delete(fName);
  end;
end;

Bei den Kollegen, die keinen Schreibzugriff haben, kommt dann folgende Meldung: Datei "L:\xxx\test.tmp" kann nicht erstellt werden. Zugriff verweigert.
Diese Meldung wollte ich eigentlich vermeiden. Wie kann ich das tun?

juergen 23. Jun 2020 18:20

AW: Schreibzugriff Datei prüfen
 
Ich vermute die Meldung kommt beim:
Delphi-Quellcode:
  FS := TFile.Create(fName);
Folgendes fängt die Fehlermeldung ab:
Delphi-Quellcode:
Try
  FS := TFile.Create(fName);
Except
  // mach hier was du willst
End;
:stupid:

himitsu 23. Jun 2020 18:56

AW: Schreibzugriff Datei prüfen
 
Zitat:

Delphi-Quellcode:
  FS := TFile.Create(fName);
  try
    result := true;
  finally
    FS.Free;
  end;
  if TFile.Exists(fName) then begin
    TFile.Delete(fName);
  end;

Exists ist sinnlos, denn wenn es ging, dann existiert die Datei und wenn Create nicht ging, dann kommt das Programm garnicht bis da hin.


Zitat:

Folgendes fängt die Fehlermeldung ab:
Da drin aber auf Keinen Fall auf FS zugreifen, denn der Variable wurde ja nichts zugewiesen.

Delphi-Quellcode:
try
  fName := TPath.Combine(ExtractFilePath(fDir), 'test.tmp');
  FS := TFile.Create(fName);
  try
    Result := True;
  finally
    FS.Free;
    TFile.Delete(fName);
  end;
except
  Result := False;
end;
Delphi-Quellcode:
try
  fName := TPath.Combine(ExtractFilePath(fDir), 'test.tmp');
  TFile.WriteAllText(Name, '');
  TFile.Delete(fName);
  Result := True;
except
  Result := False;
end;
Direkt mit der WinAPI ist's hier aber "schöner", da man dann die Exceptions nicht hat, sondern nur schön stille Result-Werte.
Delphi-Quellcode:
fName := TPath.Combine(ExtractFilePath(fDir), 'test.tmp');
H := CreateFile(PChar(fName), GENERIC_WRITE, 0, nil, {CREATE_ALWAYS} CREATE_NEW, {0} FILE_ATTRIBUTE_TEMPORARY, 0);
CloseHandle(H);
//DeleteFile(PChar(fName)); // nicht nötig, da FILE_ATTRIBUTE_TEMPORARY, womit Windows die Datei automatisch löscht
Result := H <> INVALID_HANDLE_VALUE;

dummzeuch 23. Jun 2020 19:12

AW: Schreibzugriff Datei prüfen
 
Wenn die Datei immer gleich heißt, muss Du noch berücksichtigen, dass theoretisch mehrere gleichzeitig versuchen darauf zuzugreifen (sowohl für die INI-Datei als auch für die Test-Datei).

zeras 23. Jun 2020 19:48

AW: Schreibzugriff Datei prüfen
 
Danke für den Schnipsel.

Zitat:

Zitat von himitsu (Beitrag 1468127)

Direkt mit der WinAPI ist's hier aber "schöner", da man dann die Exceptions nicht hat, sondern nur schön stille Result-Werte.
Delphi-Quellcode:
fName := TPath.Combine(ExtractFilePath(fDir), 'test.tmp');
H := CreateFile(PChar(fName), GENERIC_WRITE, 0, nil, {CREATE_ALWAYS} CREATE_NEW, {0} FILE_ATTRIBUTE_TEMPORARY, 0);
CloseHandle(H);
//DeleteFile(PChar(fName)); // nicht nötig, da FILE_ATTRIBUTE_TEMPORARY, womit Windows die Datei automatisch löscht
Result := H <> INVALID_HANDLE_VALUE;

Ich habe die Zeilen übernommen, musste aber trotzdem die Datei mittels Deletefile löschen, da sie trotzdem angelegt wurde.

himitsu 23. Jun 2020 20:52

AW: Schreibzugriff Datei prüfen
 
Hmmm ... gut, im Vorrang soll es das Caching steuern, aber bei meiner letzten Verwendung war die Datei nach Freigabe des letzten Dateihandles verschwunden.
OK, ist schon paar Jahre her und vielleicht haben die was geändert, oder sie ist erst beim nächsten Neustart weg, oder es liegt am Verzeichnis wo die liegt. :oops:

Nja, ansonsten einfach die 0 da rein und da Delete dekommentieren. :D


Alle Zeitangaben in WEZ +1. Es ist jetzt 04:34 Uhr.

Powered by vBulletin® Copyright ©2000 - 2024, Jelsoft Enterprises Ltd.
LinkBacks Enabled by vBSEO © 2011, Crawlability, Inc.
Delphi-PRAXiS (c) 2002 - 2023 by Daniel R. Wolf, 2024 by Thomas Breitkreuz