Entwickler-Ecke
Dateizugriff - Profilpfad bei W2K des Users auslesen, aber wie?
del1312 - Di 17.06.03 13:00
Titel: Profilpfad bei W2K des Users auslesen, aber wie?
Hi Leute,
ich möchte unter W2K den Pfad des Users auslesen. Also bei W2K ist das ja unter:
C:\Dokumente und Einstellungen\User1
C:\Dokumente und Einstellungen\User2
usw.
Wie kann ich diesen Pfad auslesen?
Danke schon mal ;o)
foxy - Di 17.06.03 13:01
was willste genau auslesen?
welche user es gibt oder wie oder was?? :D
del1312 - Di 17.06.03 13:07
hm ok war vielleicht blöd erklärt. :oops: ich will nen userspezifische datei dort ablegen. der pfad bis hier hin ist ok C:\Dokumente und Einstellungen\ ich muss also den aktuellen user noch dranhängen und wie ich den bekomme weiss ich nicht.
mir fällt grad ein, wenn jetzt jemand nicht c sondern festplatte d hat dann funzt das prog ja nicht, also wäre noch klasse wie ich den userpfad auch noch direkt auslesen
del1312 - Di 17.06.03 13:20
os supi, vielen dank :o)
del1312 - Di 17.06.03 15:20
hm mist ist ich komme mit dem code nicht klar :o( gibt es nicht ne funktion wie paramstr(0) die den pfad vom prog ermittelt. ist kurz und schmerzlos :o)
kiwicht - Fr 20.06.03 07:31
| ecspooky hat folgendes geschrieben: |
hm ok war vielleicht blöd erklärt. :oops: ich will nen userspezifische datei dort ablegen. der pfad bis hier hin ist ok C:\Dokumente und Einstellungen\ ich muss also den aktuellen user noch dranhängen und wie ich den bekomme weiss ich nicht.
mir fällt grad ein, wenn jetzt jemand nicht c sondern festplatte d hat dann funzt das prog ja nicht, also wäre noch klasse wie ich den userpfad auch noch direkt auslesen |
es gibt ja unter Windows diese Shell-Platzhalter, %windir% dürfte dir zum Beispiel was sagen...
genauso klappt das natürlich auch mit dem zur Zeit angemeldeten Benutzer (sehr wichtig in Domänen-Netzwerken wenn man mit unterschiedlichen Nutzerprofilen etc. arbeitet)
Und zwar heisst der Platzhalter dann:
%userprofil%Und um auf das passende Laufwerk zu kommen nimmst du einfach:
%systemdrive%
als Beispiel mal n Verzeichnisswechsel:
| Zitat: |
C:\Dokumente und Einstellungen>cd %userprofile%
C:\Dokumente und Einstellungen\arbeitsplatz.nutzer1> |
Hoffe das hilft dir weiter...
mfG
del1312 - Fr 20.06.03 08:13
hi kiwicht :D :
hm das funzt hier nicht, was ist daran falsch?
Quelltext
1:
| if FileExists('C:\Dokumente und Einstellungen\' + %USERNAME% + '\Eigene Dateien\SN2003.txt')then goto speicherdatei_ok |
kiwicht - Fr 20.06.03 10:40
das sind Windows-Eigene Variablen, es dürfte also Funktionieren, wenn du sie DIREKT übergibst.. versuchs mal so:
Delphi-Quelltext
1:
| if FileExists('C:\Dokumente und Einstellungen\%USERPROFILE%\Eigene Dateien\SN2003.txt')then goto speicherdatei_ok |
und nicht USERNAME, sonder USERPROFILE!
del1312 - Fr 20.06.03 11:02
nee funzt nicht, er legt dann keine datei an. kommt aber auch keine fehlermeldung. :(
kiwicht - Fr 20.06.03 11:26
hm.. habs jetzt auch mal getestet... seltsam.
Wie gesagt, funktionieren tut's schon, aber scheinbar nur unter der cmd-line... schade
eins hab ich noch rausgefunden.... %userprofile% übergibt nicht nur den namen, sondern den kompletten Pfad zu dem aktuellen profil...
aber wie das unter Delphi einsetzbar ist... keine Ahnung....
Delete - Fr 20.06.03 11:33
Vielleicht, weil
fileexists in erster Linie einen String erwartet, der auf eine Datei zeigt? Wenn du Environment-Variablen verwenden willst, dann musst du sie erst parsen (
GetEnvironmentVariable).
Ich frage mich aber, warum du diesen Weg nimmst? Im SwissDelphiCenter gibt es passenden Code über Shell-Funktionen (der obere Teil, vor dem Registry-Zeug). Etwas ähnliches findest du hier im Forum auch:
Wie kann ich ... spezielle Windows-Ordner öffnen? [
http://www.delphi-forum.de/viewtopic.php?t=11390]
Die für dich interessante Konstante nennt sich
CSIDL_PROFILE. (Du solltest ernsthaft einen Blick ins MSDN oder PSDK von Microsoft erwägen!) Nehmen wir die Funktion "GetDeskTopPath" aus dem SDC und gestalten sie ein bisschen um:
Delphi-Quelltext
1: 2: 3: 4: 5: 6: 7: 8: 9: 10: 11: 12: 13: 14: 15: 16: 17: 18: 19: 20:
| function GetSpecialFolder(iGUID: integer): string; var shellMalloc : IMalloc; ppidl : PItemIdList; begin ppidl := nil; try if SHGetMalloc(shellMalloc) = NOERROR then begin SHGetSpecialFolderLocation(Form1.Handle, iGUID, ppidl); SetLength(Result, MAX_PATH); if not SHGetPathFromIDList(ppidl, PChar(Result)) then raise exception.create('SHGetPathFromIDList failed : invalid pidl'); SetLength(Result, lStrLen(PChar(Result))); end; finally if ppidl <> nil then shellMalloc.free(ppidl); end; end; |
(ungetestet!)
Jetzt liefert sie (hoffentlich) den Pfad zurück, dessen GUID du angibst. Im Fall des Profilpfades also
Delphi-Quelltext
1:
| ShowMessage(GetSpecialFolder(CSIDL_PROFILE)); |
Und? War´s so schwer?
kiwicht - Fr 20.06.03 11:46
hm, zugegeben, meine Methode ist sehr umständlich, aber dafür jagt mir deine Angst ein :D
Aber mal zu dem "GetEnviromentVariable": Wenn das so auch geht, wär das dann nicht vielleicht sogar der kürzere Weg?
Bin das eben mal durchgegangen, das würde dann so aussehen:
Delphi-Quelltext
1: 2:
| myvar := GetEnvironmentVariable('userprofile'); if FileExists(myvar + '\test.txt') then ShowMessage('Gefunden!'); |
Wo genau liegt nun der Vorteil der beiden Möglichkeiten?
mfG
Delete - Fr 20.06.03 16:32
Die Variable %userprofile% gibt es IMHO unter Windows 9x nicht. Zumindest nicht unter dem Multi-User-Win98, in das ich gerade mal reingeschaut habe. Ich würde daher mal sagen, dass hier die Idee mit dem Abfragen der Variablen versagt.
Dagegen funktioniert die Shell-Funktion sowohl unter 9x- als auch unter NT-Systemen und liefert in beiden Fällen den Profilpfad des angemeldeten Users zurück.
Ich finde es auch nicht beängstigend - nur gewöhnungsbedürftig. :)
kiwicht - Fr 20.06.03 20:31
hm, stimmt.
Dann macht das natürlich Sinn... ich verstehe, und gestehe! :)
mfG
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!