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


foxy - Di 17.06.03 13:11

aso ok ... pass auf ich hab da gerade was gefunden was dir in deinen beiden Problemen weiterhilft!

http://www.swissdelphicenter.ch/de/showcode.php?id=233


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