Entwickler-Ecke
Dateizugriff - Anwender-Verzeichnis feststellen
jasocul - Mo 02.05.05 10:15
Titel: Anwender-Verzeichnis feststellen
Im Bezug zu
diesem [
http://www.delphi-forum.de/viewtopic.php?t=41178&highlight=] Thread, bin ich ein wenig ins Grübeln gekommen.
Ich würde gerne Dateien ins Anwender-Verzeichnis (INI-Dateien) ablegen.
Aber wie stelle ich in Delphi fest, wie dieses heißt?
Bevor jemand meckert: Die Suche habe ich versucht. Leider nichts passendes gefunden.
Amiga-Fan - Mo 02.05.05 10:37
hm also wenn hier über die Suche fast nix dazu zu finden ist und es nichtmal eine native Delphi-Funktion dafür gibt, kann man den Leuten auch kaum einen Vorwurf machen, wenn das nicht genutzt wird....
zuhause schaue ich nochmal nach... wenn mir keiner zuvorkommmt...
BenBE - Mo 02.05.05 10:43
@Tino: Die Konstanten müssten laut der Beschreibungen hinhauen.
jasocul - Mo 02.05.05 10:49
Ich probiere es heute mal aus. Ergebnis teile ich dann mit.
Ergebnis:
Funktioniert einwandfrei.
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:
| uses ActiveX, ShlObj;
Function GetUserAppDataPath : String; var pIdL: PItemIDList; Path: Array [0..Max_Path] Of Char; Allocator: IMalloc; Begin SHGetSpecialFolderLocation (0, CSIDL_APPDATA, pIdL);
SHGetPathFromIDList (pIDL, Path);
If Succeeded (SHGetMalloc (Allocator)) Then Begin Allocator.Free (pIdL); {$IFDEF VER100} Allocator.Release; {$ENDIF} End;
Result := Path; end; |
@Tino: In meinem Source steht selbstverständlich ein Hinweis auf die Quelle. Du bist namentlich genannt, wie es sich gehört. :wink:
Delete - Mo 02.05.05 13:29
Amiga-Fan hat folgendes geschrieben: |
| und es nichtmal eine native Delphi-Funktion dafür gibt, |
Was hat die Programmiersprache damit zu tun? Die API muss es hergeben und das tut sie, wie man sieht.
jasocul - Mo 02.05.05 13:34
Und ich werde mal nachsehen, wie es unter .NET geht. Da gibt es keine API-Aufrufe. :wink:
Habs gefunden. Unter .NET heißt der Aufruf:
Delphi-Quelltext
1:
| environment.GetFolderPath(Environment.SpecialFolder.LocalApplicationData); |
Delete - Mo 02.05.05 21:40
Guck mal ins .NET Framework SDK unter
Application rein. Stichworte:
- CommonAppDataPath
- CommonAppDataRegistry
- UserAppDataPath
- UserAppDataRegistry
Das Witzige ist, dass die Pfade auch gleich noch erstellt werden. Die Registrykeys habe ich nicht ausprobiert, aber ich schätze, da wird´s ähnlich sein ;). Die Namen richten sich nach Firma/Anwendungsname/Versionsnummer.
Popov - Mo 02.05.05 23:44
Ist richtig, aber mit einem "aber". Für alle die Delphi 6 usw. haben ist das richtig. Für alle die Delphi 3 haben, und das sind viele hier, fehlt die
CSIDL_COMMON_APPDATA Konstante. In diesem Fall muß man den passenden Integerwert nehmen.
Hier habe ich ein kleines Programm mit dem es möglich ist alle Pfade auszulesen. Die ListBox1 sollte dabei das ganze Fenster füllen, da die Pfade lang sind:
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:
| uses Shlobj;
function SpecialDirectory(ID: Integer): String; var pidl : PItemIDList; Path : PChar; begin if SUCCEEDED(SHGetSpecialFolderLocation(0, ID, pidl)) then begin Path := StrAlloc(max_path); SHGetPathFromIDList(pidl, Path); Result := String(Path); end else Result := ''; end;
procedure TForm1.Button1Click(Sender: TObject); var i: Integer; begin for i := 0 to 128 do begin ListBox1.Items.Add(Format('Wert: %d - Pfad: %s', [i, SpecialDirectory(i)])); end; end; |
Delete - Di 03.05.05 08:12
Popov hat folgendes geschrieben: |
| Für alle die Delphi 6 usw. haben ist das richtig. Für alle die Delphi 3 haben, und das sind viele hier, fehlt die CSIDL_COMMON_APPDATA Konstante. In diesem Fall muß man den passenden Integerwert nehmen. |
Oder man nimmt sich die Werte und Konstantennnamen aus den Headerdateien von Microsofts PSDK. Das ist sowieso zu empfehlen, auch wenn man nur Hobby-Entwickler ist, zumal das PSDK ja auch nichts kostet.
Entwickler-Ecke.de based on phpBB
Copyright 2002 - 2011 by Tino Teuber, Copyright 2011 - 2026 by Christian Stelzmann Alle Rechte vorbehalten.
Alle Beiträge stammen von dritten Personen und dürfen geltendes Recht nicht verletzen.
Entwickler-Ecke und die zugehörigen Webseiten distanzieren sich ausdrücklich von Fremdinhalten jeglicher Art!