Autor Beitrag
N8Falter74
ontopic starontopic starontopic starontopic starontopic starontopic starontopic starontopic star
Beiträge: 53

Win XP
D7 Prof
BeitragVerfasst: Mo 15.08.05 15:55 
Hallo Forum

ich habe folgendes Problem:
In einer Datenbanktabelle habe ich eine liste mit Dateinamen. Mit meiner Anwendung kann man
in dieser Liste suchen und sich die Dateien anzeigen lassen. Also nix besonderes.

Die Dateien liegen auf einem Windows Server in einer Freigabe.
Die Freigabe verweist auf ein Verzeichnis einer NTFS Partition.

Das klappt auch alles soweit wunderbar, solange der Benutzer mindestens Leserechte
auf die Dateien hat.
Nun möchte aber der Admin bestimmte Dateien und Unterordner für einige Benutzer per
NTFS Rechte sperren - und hier ist dann das Problem: Die Anwendung stürzt mit 2-3
Schutzverletzungen und Fehlermeldungen ab wenn ein Benutzer versucht auf eine per
NTFS gesperrte Datei zuzugreifen.

Wie kann ich aus Delphi feststellen, ob ich auf eine bestimmte Datei zugreifen darf oder nicht.
Am liebsten wäre sowas wie: function FileAccessable(FileName: String): boolean. :D

Hat jemand ne idee?

mfg
Sebastian

PS: FileExists bringt an dieser Stelle nix, die Datei ist ja da, nur kein Zugriffsrecht. :(
azubi_20
ontopic starontopic starontopic starontopic starontopic starontopic starontopic starofftopic star
Beiträge: 593

WinXP SP2, Ubuntu 8.4
D7 Enterp., D2005 Prof., Java (Eclipse 3.4.0)
BeitragVerfasst: Mo 15.08.05 16:34 
Bei NTFS kannst du mit der API-Funktion GetFileAttributes die Attribute der Datei anzeigen lassen. Ich benutz das nicht so häufig und hab jetzt hier gerade kein Delphi, kann dir deshalb kein Beispiel geben :cry:
uall@ogc
ontopic starontopic starontopic starontopic starontopic starontopic starontopic starofftopic star
Beiträge: 1826
Erhaltene Danke: 11

Win 2000 & VMware
Delphi 3 Prof, Delphi 7 Prof
BeitragVerfasst: Mo 15.08.05 16:52 
ich kann dir jetzt auch keine directe api lösung nennen,
aber nen FileAccessable kannste doch ganz leicht mit einem try finally nachbaun

ausblenden Delphi-Quelltext
1:
2:
3:
4:
5:
6:
7:
8:
9:
10:
11:
12:
function FileAccessable(Filename: String): boolean;
var f: file of byte;
begin
  result := false;
  Assigfile(f,Filename);
  try
    Reset(f);
    result := true;
  finally
    CloseFile(f);
  end;
end;


ungetestet

_________________
wer andern eine grube gräbt hat ein grubengrabgerät
- oder einfach zu viel zeit
N8Falter74 Threadstarter
ontopic starontopic starontopic starontopic starontopic starontopic starontopic starontopic star
Beiträge: 53

Win XP
D7 Prof
BeitragVerfasst: Mo 15.08.05 18:05 
@azubi_20
Danke für den Tip mit GetFileAttributes ich werde mir das mal bei Zeiten etwas genauer ansehen.
Ist mit Sicherheit nicht schlecht, wenn man alle Attribute auslesen kann und richtig auf alle
reagieren kann. Mit Sicherheit gibt es auch ein SetFileAttributes... das könnte ich u.u. auch
gut in meiner Anwendung verwenden.

@uall@ogc
Ha! Da hätte ich ja auch drauf kommen können... Manchmal denkt man einfach zu kompliziert.
Ich werde das jetzt erst mal so umsetzten und wenn ich etwas mehr Luft habe, werde ich mir
mal die API, die azubi_20 vorgeschlagen hat, ansehen.

Danke erstmal.

Sebastian
N8Falter74 Threadstarter
ontopic starontopic starontopic starontopic starontopic starontopic starontopic starontopic star
Beiträge: 53

Win XP
D7 Prof
BeitragVerfasst: Mo 15.08.05 19:31 
user profile iconN8Falter74 hat folgendes geschrieben:

@uall@ogc
Ha! Da hätte ich ja auch drauf kommen können... Manchmal denkt man einfach zu kompliziert.
Ich werde das jetzt erst mal so umsetzten und wenn ich etwas mehr Luft habe, werde ich mir
mal die API, die azubi_20 vorgeschlagen hat, ansehen.


Tja, da hatte ich mich wohl etwas zu früh gefreut. AssignFile(f, FileName) erzeugt beim
Zugriff auf eine mit NTFS gesperrte Datei einen "E/A Fehler 1xx" der auch nicht durch das
try - finally oder auch ein try - except abgefangen wird... komisch :?:

Naja, die Idee war ja nicht schlecht und deshalb habe ich es mal mit der FileOpen Funktion
versucht. Und siehe da, damit geht es. Sollte eine FileOpen Funktion nicht auf eine Datei
zugreifen können, liefert sie als File Handle -1 zurück.

Die Delphi Hilfe meint zwar man solle FileOpen usw. nicht verwenden, da Sie Delphi inkompatible
System Handles zurückliefert - aber für den Zugriffschutz Test denke ich, ist das schon ok :)

Hier der Code falls nochmals jemand sowas braucht:

ausblenden Delphi-Quelltext
1:
2:
3:
4:
5:
6:
7:
8:
9:
10:
function FileAccessable(FileName:String): boolean;
var iFile: Integer;
begin
  try
    iFile := FileOpen(FileName, fmOpenRead);
    if iFile > 0 then result := True else result := False;
  finally
    FileClose(iFile);
  end;
end;



Liebe Grüße

Sebastian
drstar
ontopic starontopic starontopic starontopic starontopic starontopic starontopic starhalf ontopic star
Beiträge: 79
Erhaltene Danke: 2

Windows 8.1/x64
Delphi 10.1
BeitragVerfasst: Mi 17.08.05 16:19 
Laufzeitfehler dieser Art entstehen häufig dadurch, daß der Progger sich nicht in ausreichendem Maße darum kümmert, Fehlerbehandlungsroutinen zu implementieren.
Dafür gibt es in diesem konkreten Fall diese Möglichkeit:

...Code...
ASSIGN(F, FName);
{$I-}
RESET(F);
Result := IORESULT;
{$I+}
if Result<>0
then
case Result OF
1: Meldung Fehler xyz aufgetreten... (z. B. Zugriff verweigert/ Access denied, stimmt für diesen Code natürlich nicht...)

2: Meldung Fehler xyz aufgetreten...
...
end;
end;
Luckie
Ehemaliges Mitglied
Erhaltene Danke: 1



BeitragVerfasst: Mi 17.08.05 16:30 
user profile iconazubi_20 hat folgendes geschrieben:
Bei NTFS kannst du mit der API-Funktion GetFileAttributes die Attribute der Datei anzeigen lassen.

Das halte ich aber für ein gerücht:
Zitat:

The GetFileAttributes function retrieves attributes for a specified file or directory.
This function retrieves a set of FAT-style attribute information.

Das sind die ganz normalen Dateiattribute wie Archiv, Schreibgeschütz, Versteckt usw. Er will aber wissen, welche Rechte ein benutzer an einer bestimmten Datei hat. Und das hat mit dieser Funktion gar nichts zu tun.