Delphi-PRAXiS
Seite 2 von 2     12   

Delphi-PRAXiS (https://www.delphipraxis.net/forum.php)
-   Sonstige Fragen zu Delphi (https://www.delphipraxis.net/19-sonstige-fragen-zu-delphi/)
-   -   Delphi Prüfen, ob man in ein Verzeichnis schreiben kann (https://www.delphipraxis.net/66491-pruefen-ob-man-ein-verzeichnis-schreiben-kann.html)

r2c2 6. Apr 2006 20:25

Re: Prüfen, ob man in ein Verzeichnis schreiben kann
 
Hab jetzt wieder etwas Zeit gefunden und bin mittlerweile so "weit":
Delphi-Quellcode:
function CanCreateFile(const ADir: string): Boolean;
var
  i, i2: Integer;
  i2: Integer;
  FileName: string;
  Found: Boolean;
  F: THandle;
begin
  FileName := IncludeTrailingBackslash(ADir) + 'TestFile';
  i := GetTickCount;
  i2 := i;
  Found := False;
  // eindeutigen Dateinamen ermitteln:
  repeat
    if i - i2 > 10000 then
      raise Exception.Create('Temporäre Datei konnte nicht erstellt werden.');
    FileName := FileName + IntToHex(i, 8);
    if not FileExists(FileName) then
      Found := True;
    Inc(i);
  until Found;
  // Datei erstellen und automatisch löschen lassen:
  F := CreateFile(PChar(FileName), GENERIC_READ or GENERIC_WRITE, 0, nil,
    OPEN_ALWAYS, FILE_ATTRIBUTE_TEMPORARY or FILE_ATTRIBUTE_NOT_CONTENT_INDEXED
    or FILE_FLAG_DELETE_ON_CLOSE or FILE_FLAG_RANDOM_ACCESS, 0);
  Result := (F <> INVALID_HANDLE_VALUE);
  CloseHandle(F);
end;
(Bisher noch ungetestet)

Hab dann noch weitere Überlegungen angestellt:
Wenn ich jetzt noch zusätzlich Schreibrechte abfragen will, kommt es zu folgenden Problemen:
- Bei Win9x gibts keine Rechte
- Bei FAT-Dateisystemen IMHO auch nicht
- Auf ner CD auch nicht
- Schreibgeschützte Disketten und USB-Sticks gehören ebenfalls dazu

Wie nun das Problem lösen? :gruebel:

Überlegt hab ich mir folgendes(Pseudocode):
Delphi-Quellcode:
function TOptions.CanWrite(const ADir: string): Boolean;
begin
  if IsNT then
  begin
    if IsNTFS then
    begin
      if CheckUserRights then
      begin
        Result := CanCreateFile(ADir);
      end
      else
      begin
        Result := False;
      end;
    end
    else
    begin
      Result := CanCreateFiel(ADir);
    end;
  end
  else
  begin
    Result := CanCreateFile(ADir);
  end;
end;
Was sehen wir also:
- sehr viel Aufwand
- Es wird eh in (fast) jedem Fall CanCreateFile aufgerufen
- sieht irgendwie auch...ähm... umständlich bis sinnlos aus
- was, wenn WinFS kommt?

Andere Methode(Pseudocode):
Delphi-Quellcode:
function TOptions.CanWrite(const ADir: string): Boolean;
begin
  if IsNT and IsNTFS then
  begin
    if CheckUserRights then
    begin
      Result := True;
    end
    else
    begin
      Result := False;
    end;
  end
  else
  begin
    if IsCD then
    begin
      Result := False;
    end
    else if IsReadOnlyDevice then
    begin
      Result := False;
    end
    else
    begin
      Result := True;
    end;
  end;
end;
Was sehen wir also:
- noch mehr Aufwand
- kein CanCreateFile-Aufruf mehr
- sieht irgendwie auch...ähm... umständlich aus
- was, wenn WinFS kommt?
- kann ich mir sicher sein, dass ich nix vergessen hab?

Mir scheint also die Holzhammermethode doch angebrachter zu sein... :wall:

Oder hab ich irgendwas übersehen? Mach ichs komplizierter, als es ist? was meint ihr?

mfg

Christian

toms 6. Apr 2006 20:44

Re: Prüfen, ob man in ein Verzeichnis schreiben kann
 
Zitat:

Mir scheint also die Holzhammermethode doch angebrachter zu sein...
Ist sie auch.
Mal ehrlich: Wer hier im Forum ueberprueft vor dem Speichern die Rechte (ala IsCD, CheckUserRights etc) bevor z.B in eine Ini-Datei gespeichert wird?


Alle Zeitangaben in WEZ +1. Es ist jetzt 13:52 Uhr.
Seite 2 von 2     12   

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