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?
Ü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...
Oder hab ich irgendwas übersehen? Mach ichs komplizierter, als es ist? was meint ihr?
mfg
Christian