Delphi-PRAXiS
Seite 1 von 2  1 2      

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 30. Mär 2006 12:23


Prüfen, ob man in ein Verzeichnis schreiben kann
 
Hallo DPler :hi:
ich möchte herausfinden, ob ich in einem Verzeichnis schreiben kann(Es dreht sich um eine Datei mit Programmoptionen). Möglichkeiten sind mir da genau drei eingefallen:

Möglichkeit a)
Delphi-Quellcode:
function TOptions.CanWrite(ADir: string): Boolean;
var
  F: File;
  FileName: string;
begin
  FileName := IncludeTrailingBackslash(ADir) + 'TestFile_' + DateTimeToStr(Now); // Unwahrscheinlich, dass so ne Datei schon existiert
  try
    AssignFile(F, FileName);
    try
      Rewrite(F);   // einfach mal erstellen                
    finally
      CloseFile(F);
    end;
    if FileExists(FileName) then // hat das Erstellen geklappt?
    begin
      DeleteFile(PChar(FileName)); // Datei wird ja nicht mehr gebraucht
      Result := True;
    end
    else
    begin
      Result := False;
    end;
  except
    Result := False; // Fehler bein Erstellen
  end;
end;
Einfach ne Datei erstellen und gucken, obs geklappt hat.

Vorteil:
- Leicht zu implementieren :wink:

Nachteil:
- Sieht irgendwie unprofessionell aus :(

Möglichleit b)
- Auf OS prüfen
--> wenn Win9x: erstmal true
--> wenn WinNT+: Schreibrechte prüfen
- Dann auf Datenträger prüfen: CD: false, HD: true

Vorteil:
- sieht professioneller aus :wink:

Nachteile:
- Viel Quelltext
- Wer weiß, ob ich nicht irgendwas vergessen hab oder sich was mit Vista, WinXP SP3, ... ändert?

Möglichkeit c)
- Auf Dateisystem prüfen:
--> FAT: true
--> NTFS: Schreibrechte prüfen
--> CDFS: false

Vorteil:
- sieht professioneller aus :wink:

Nachteile:
- Viel Quelltext
- Was, wenn WinFS(kommt IIRC mit Vista SP1 oder? :gruebel:) kommt?
- Wer weiß, ob ich nicht irgendwas vergessen hab oder sich was mit Vista, WinXP SP3, ... ändert?

Was würdet ihr machen? a) b) c) oder doch vielleicht Möglichkeit d), die wunderbar funktioniert, keine von-hinten-durch-die-Brust-ins-Auge-Funktion ist und mir nur nicht einfallen will... :wall:

mfg

Christian

Luckie 30. Mär 2006 12:33

Re: Prüfen, ob man in ein Verzeichnis schreiben kann
 
Guckst du hier: http://www.michael-puff.de/Developer...ileAccess.html ;)

toms 30. Mär 2006 12:38

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

Ich wuerde Moeglichkeit 1) nehmen.

Denn du muestest auch ueberpruefen, ob die Datei nicht exklusiv von einem anderen Programm geoeffnet ist,
ob genuegend Speicherplatz vorhanden ist etc. Siehe auch http://tinyurl.com/eaqq8

r2c2 30. Mär 2006 12:46

Re: Prüfen, ob man in ein Verzeichnis schreiben kann
 
@Luckie:
ähm... kenn ich schon. Wäre Variabte b) und c)

@toms:
Sollen Programmeinstellungen sein. Also ist es unwahrscheinlich, dass die Datei schon exklusiv geöffnet ist. Auch bei zu wenig Speicherplatz hat man IMHO andere Sorgen, als ein Prog, das nun mal seine Einstellungen nicht speichern kann...
Wenn du aber meinst Möglichkeit a) wär einfacher(mein ich auch :wink:), werd ich wahrscheinlich die nehmen.

Oder hat das noch andere Nachteile?

mfg

Christian

himitsu 30. Mär 2006 18:28

Re: Prüfen, ob man in ein Verzeichnis schreiben kann
 
Zu Variante A: vorher prüfen ob die Datei schon existiert und eventuell einen anderen Namen wählen.
Aber was ist, wenn du zwar die Rechte zum erstellen der Datei hast und nicht zum löschen, dann bleibt die Datei ja in dem Ordner und mit der Zeit sammeln die sich mit der Zeit an.

PS: siehe da http://www.delphipraxis.net/internal...=522098#522098 ... einfach nur'n anderes Verzeichnis verwenden.

r2c2 30. Mär 2006 19:28

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

Zitat von himitsu
Zu Variante A: vorher prüfen ob die Datei schon existiert und eventuell einen anderen Namen wählen.

Is zwar sehr unwahrscheinlich, dass ne Datei existiert, die das aktuelle Datum samt Uhrzeit am Ende hat, aber von mir aus, kann ich das auch noch testen...

Zitat:

Aber was ist, wenn du zwar die Rechte zum erstellen der Datei hast und nicht zum löschen, dann bleibt die Datei ja in dem Ordner und mit der Zeit sammeln die sich mit der Zeit an.
Geht das? Ich dachte, wenn man Dateien erstellen kann, is man automatisch "Besitzer" der Datei und kann sie deshalb auch wieder löschen; oder hab ich da was falsch verstenaden? :gruebel:

Zitat:

PS: siehe da http://www.delphipraxis.net/internal...=522098#522098 ... einfach nur'n anderes Verzeichnis verwenden.
Guck ich mir mal an. Danke!

mfg

Christian

himitsu 31. Mär 2006 09:43

Re: Prüfen, ob man in ein Verzeichnis schreiben kann
 
Nee, man kann die Rechte explizit vergeben, also Erstellen, Lesen, Schreiben, Bearbeiten, Löschen und so.

So kann man z.B. eine Datei erstellen/schreiben lassen, aber dennoch verbieten vorhandene Dateien zu löschen, oder zu verändern (unabhängig vom Besitzer).

Das mi der Schon vorhandene Datei ... es brauchen ja z.B. nur 2 Programme in der selben Sekunde sowas zu versuchen und schon beeinflussen die sich selber.

PS: hast du den Code mit DateTimeToStr schonmal probiert, oder ist der nur so zusammengebaut?
Weil im deutschen ja als Trennzeichen für die Uhrzeit ein ":" drin ist und sowas ist im Dateinamen nicht erlaubt.
Drum hab ich mir ja 'nen anderen Zeitwert (GetTickCount) als Haxadezimal genommen (Buchstaben und Zahlen sind ja erlaubt) und da ich mir die Datei nur erstellen lasse, wenn es sie noch nicht giebt (CREATE_NEW) und es danach mit einen aanderem Namen versuche, kann auch keine Datei überschrieben werden ^^

Es ist also wirklich am esten die Rechte direkt abzufragen (z.B. ala Luckie) und danach könnte man, wenn man wirklich gaaaanz sichergehn will, das man wirklich die nötigen Rechte hat, immernoch eine Datei erstellen und es so testen (aber nur wenn der erste Test meinte man habe die Rechte dazu) ._.

r2c2 2. Apr 2006 13:43

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

Zitat von himitsu
Das mi der Schon vorhandene Datei ... es brauchen ja z.B. nur 2 Programme in der selben Sekunde sowas zu versuchen und schon beeinflussen die sich selber.

Gut. Is n Argument...

Zitat:

PS: hast du den Code mit DateTimeToStr schonmal probiert, oder ist der nur so zusammengebaut?
Weil im deutschen ja als Trennzeichen für die Uhrzeit ein ":" drin ist und sowas ist im Dateinamen nicht erlaubt.
:gruebel: Hm... hast Recht! Hab das nur mal so runtergetippt. War ja noch auf der Suche nach der besten Möglichkeit...

Zitat:

Es ist also wirklich am esten die Rechte direkt abzufragen (z.B. ala Luckie) und danach könnte man, wenn man wirklich gaaaanz sichergehn will, das man wirklich die nötigen Rechte hat, immernoch eine Datei erstellen und es so testen (aber nur wenn der erste Test meinte man habe die Rechte dazu) ._.
Gut, werds mal - wenn ich wieder mehr Zeit hab(morgen, übermorgen... :gruelbel:) - so machen und dann das Ergebnis anhängen...

mfg

Christian

toms 3. Apr 2006 20:24

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

Zitat von himitsu
Es ist also wirklich am esten die Rechte direkt abzufragen (z.B. ala Luckie) und danach könnte man, wenn man wirklich gaaaanz sichergehn will, das man wirklich die nötigen Rechte hat, immernoch eine Datei erstellen und es so testen

Ist doch voellig unnoetig, zuerst zu ueberpruefen, ob der User die Rechte dazu hat.
Eine Try..Except (Holzhammer Methode) genuegt doch vollends alles andere ist IMO unnoetig und zuviel Aufwand.

himitsu 4. Apr 2006 15:17

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

Zitat von toms
Ist doch voellig unnoetig, zuerst zu ueberpruefen, ob der User die Rechte dazu hat.
Eine Try..Except (Holzhammer Methode) genuegt doch vollends alles andere ist IMO unnoetig und zuviel Aufwand.

Eigentlich sollte es ja reichen, wenn man nur die Rechte prüft, nochmals durch ein probeweises erstellen einer Testdatei wäre nur nochmal zur völligen Sicherheit.

Bei CreateFile braucht man kein Try-Except, denn wenn es nicht geht, dann gibt diese Funktion INVALITE_FILEHANDLE (oder wie dat nochmals hieß) zurück und erzeigt keine Exception :zwinker:

Und warum nicht gleich der Holzhammer ... ließ weider oben nochmal nach ... da steht mindestens einer der vielen Gründe, welche dagegen sprechen.


Alle Zeitangaben in WEZ +1. Es ist jetzt 02:35 Uhr.
Seite 1 von 2  1 2      

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