Entwickler-Ecke

Dateizugriff - Verbesserungen beim Dateizugriff .


Hochhaus - Mi 21.11.12 16:50
Titel: Verbesserungen beim Dateizugriff .
Hallo allerseits !

ich bin definitiv kein Profi im Programmieren. Deshalb meine Frage an Euch Profis: Wie könnte ich den folgenden Code noch deutlich verbessern -->


Delphi-Quelltext
1:
2:
3:
4:
5:
6:
7:
8:
9:
10:
11:
Procedure TFrmChild.SaveToFile(S: String);
Begin
     RichEdit1.Cursor := crHourGlass;
     RichEdit1.PlainText := True;
     Try
       RichEdit1.Lines.SaveToFile(S);
       RichEdit1.Modified := False;
     Finally
       RichEdit1.Cursor := crDefault;
     End;
End{* SaveToFile *}



Hochhaus


Narses - Mi 21.11.12 17:14

Moin!

user profile iconHochhaus hat folgendes geschrieben Zum zitierten Posting springen:
Wie könnte ich den folgenden Code noch deutlich verbessern
Das hängt doch im Wesentlichen davon ab, was du für ein Ziel erreichen möchtest. :nixweiss:

Ausser einem try-except um das .SaveToFile() sehe ich da erstmal nix dringend fehlendes. :lupe:

cu
Narses


Hochhaus - Mi 21.11.12 17:25

Das Folgende möchte ich speziell abfangen können: Ein ReadOnly-Attribut auf der zu speichernden Datei, ein Schreibschutz auf dem Laufwerk oder fehlende Berechtigungen.

Grüsse,


Hochhaus


Ralf Kaiser - Mi 21.11.12 20:25

user profile iconHochhaus hat folgendes geschrieben Zum zitierten Posting springen:


Halli Hallo,

Kleine Verbesserung beim Handling des Cursors. So kann kann man die Funktion von anderen Funktionen aus aufrufen die selbst einen eigenen Cursor setzen.

Ist nur ein kosmetische "Vebesserung"...


Delphi-Quelltext
1:
2:
3:
4:
5:
6:
7:
8:
9:
10:
11:
12:
13:
14:
Procedure TFrmChild.SaveToFile(S: String);
var
   lPrevCursor: TCursor;
Begin
     lPrevCursor := Screen.Cursor;  // aktuellen Cursor sichern
     Screen.Cursor := crHourGlass;  // Wartecursor setzen
     RichEdit1.PlainText := True;
     Try
       RichEdit1.Lines.SaveToFile(S);
       RichEdit1.Modified := False;
     Finally
       Screen.Cursor := lPrevCursor;  // Vorherigen Cursetz zurückholen
     End;
End{* SaveToFile *}


Mathematiker - Mi 21.11.12 21:19

Hallo,
user profile iconHochhaus hat folgendes geschrieben Zum zitierten Posting springen:
Ein ReadOnly-Attribut auf der zu speichernden Datei, ein Schreibschutz auf dem Laufwerk oder fehlende Berechtigungen.

Das Readonly-Attribut bekommst Du über die Einstellung im Savedialog. Ich vermute, dass Du einen verwendest.
Zur Frage Schreibschutz oder fehlende Berechtigung verwende ich folgende Funktion zum Test auf Administratorrechte:

Delphi-Quelltext
1:
2:
3:
4:
5:
6:
7:
8:
9:
10:
11:
12:
13:
14:
15:
16:
17:
18:
19:
20:
21:
22:
23:
24:
25:
26:
27:
28:
29:
30:
31:
32:
33:
34:
35:
36:
37:
38:
39:
40:
41:
42:
43:
44:
45:
46:
47:
48:
49:
50:
51:
52:
53:
54:
55:
56:
57:
58:
function IsAdmin: Boolean;
const
  SECURITY_NT_AUTHORITY: TSIDIdentifierAuthority =
    (Value: (000005));
  SECURITY_BUILTIN_DOMAIN_RID = $00000020;
  DOMAIN_ALIAS_RID_ADMINS     = $00000220;
var
  hAccessToken       : THandle;
  ptgGroups          : PTokenGroups;
  dwInfoBufferSize   : Cardinal;
  psidAdministrators : PSID;
  x                  : Integer;
begin
  Result := false;
  if Win32Platform <> VER_PLATFORM_WIN32_NT then
  begin
     result:=true;
     Exit;
  end;
  if not OpenThreadToken(GetCurrentThread, TOKEN_QUERY,TRUE, hAccessToken) then
  begin
    if GetLastError <> ERROR_NO_TOKEN then
       Exit;
    if not OpenProcessToken(GetCurrentProcess, TOKEN_QUERY,hAccessToken) then
       Exit;
  end;
  try
    GetTokenInformation(hAccessToken, TokenGroups, nil,0, dwInfoBufferSize);
    if GetLastError <> ERROR_INSUFFICIENT_BUFFER then
      Exit;
    GetMem(ptgGroups, dwInfoBufferSize);
    try
      if not GetTokenInformation(hAccessToken, TokenGroups, ptgGroups,
                                 dwInfoBufferSize, dwInfoBufferSize) then
        Exit;
      if not AllocateAndInitializeSid(SECURITY_NT_AUTHORITY, 2,
             SECURITY_BUILTIN_DOMAIN_RID, DOMAIN_ALIAS_RID_ADMINS,
             000000, psidAdministrators) then
        Exit;
      try
        for x := 0 to ptgGroups^.GroupCount - 1 do
        begin
          if EqualSid(psidAdministrators, ptgGroups^.Groups[x].Sid) then
            begin
            Result := true;
            Break;
            end;
        end;
      finally
        FreeSid(psidAdministrators);
      end;
    finally
      FreeMem(ptgGroups);
    end;
  finally
    CloseHandle(hAccessToken);
  end;
end;

Der Code ist nicht von mir. Irgendwo habe ich ihn mal gesehen.
Bis jetzt hat er bei mir funktioniert. Ob das unter Windows 8 noch geht, weiß ich nicht.
Vielleicht hilft es ja etwas.

Beste Grüße
Mathematiker

Nachtrag: Ich habe gerade festgestellt, dass der Quelltext in der EE unter http://www.entwickler-ecke.de/viewtopic.php?t=41141&highlight=isadmin genauso steht. Wahrscheinlich noch öfters.


Delphi-Laie - Mi 21.11.12 23:49

Tja, das ist das Wesen aller kulturellen Güter aller Kulturen und Gesellschaft(sordnung)en: Es wird überwiegend kopiert (und mithin tradiert), zum Glück im erheblichen Maße bewährtes (leider aber bei weitem nicht nur bewährtes, und teilweise wird umgekehrt bewährtes von Schlaumeiern und Besserwissern wieder über Bord geworfen). Das ist schließlich ein, wenn nicht das Erfolgsrezept (-geheimnis?) der Menscheit.

So auch der Test, ob man Administrator ist. Das ist lässig und wird von mir wahrscheinlich bald in mein(e) Sortierkino(s) eingebaut werden, damit das/die auch bei den bemitleidenswerten Nicht-Adminstratoren in voller Funktionalität funktionert/funktionieren.


WasWeißDennIch - Do 22.11.12 10:55

Vergleicht Ihr nicht gerade ein wenig Äpfel mit Birnen? Schreibschutz oder Zugriffsverweigerung haben ja nicht zwingend mit Benutzerrechten zu tun. Auch als Admin kann ich keine Datei auf der CD der letzten Computerbild speichern, genausowenig wie ich eine exklusiv geöffnete Datei überschreiben kann.


Delphi-Laie - Do 22.11.12 11:36

Äpfel kann, ja muß man sehr wohl (auch) mit Birnen vergleichen, ansonsten könnte man sie gar nicht voneinander unterscheiden. Soviel zu dieser abgedroschenen und m.E. falschen Metapher, die genauso gedankenlos wie inflationär verwandt wird.

Richtig ist natürlich der Einwand, daß das zwei verschiedene Dinge sind, allerdings gibt es natürlich eine "gewisse Schnittmenge", nämlich in der Menge, daß Schreibrechte (jedenfalls bei potentiell beschreibbaren Datenträgern/Dateisystemen) an Benutzerkonten gekoppelt werden können.


WasWeißDennIch - Do 22.11.12 11:52

Natürlich können sie das. Allerdings kann man auch dem Admin Rechte entziehen, so dass nur noch z.B. Benutzer einer bestimmten Gruppe Schreibzugriff haben. In dem Fall nützt dann auch die Prüfung auf Administratorrechte nichts. Von daher bin ich der Meinung, dass man den Schreibversuch einfach durch einen try-except-Block absichern und im Exception-Fall deren Meldung ausgeben sollte. Wenn man alle in Frage kommenden Möglichkeiten abprüfen möchte (schreibgeschützter Datenträger, Datenträger voll, exklusiver Dateizugriff, fehlende Benutzerrechte usw.), wird man damit auf Dauer bestimmt nicht glücklich.


Delphi-Laie - Di 27.11.12 23:52

user profile iconMathematiker hat folgendes geschrieben Zum zitierten Posting springen:
Der Code ist nicht von mir. Irgendwo habe ich ihn mal gesehen.


Könnte von [url=http://www.delphi-fundgrube.de/faq13.htm#topic1315]hier[/url] stammen.