Delphi-PRAXiS

Delphi-PRAXiS (https://www.delphipraxis.net/forum.php)
-   Programmieren allgemein (https://www.delphipraxis.net/40-programmieren-allgemein/)
-   -   Delphi "User" Dokumente Verzeichnis finden (https://www.delphipraxis.net/160408-user-dokumente-verzeichnis-finden.html)

Dunkelbunt27 11. Mai 2011 17:16

"User" Dokumente Verzeichnis finden
 
Hallo Delphi-PRAXIS,

kann mir jemand sagen wie man zuverlässig das C:\Users\"User"\Dokumente Verzeichnis mit einer funktion finden kann?

FG Dunkelbunt

nuclearping 11. Mai 2011 17:28

AW: "User" Dokumente Verzeichnis finden
 
Über http://msdn.microsoft.com/en-us/libr...=vs.85%29.aspx und SHGetSpecialFolderLocation.

Delphi-Quellcode:
{ ************************************************************ }
function GetSpecialPath (AFolder: Integer): String;
{ ************************************************************ }

  { ************************************************************ }
  function PidlToPath (IdList: PItemIdList): String;
  { ************************************************************ }
  begin
    SetLength (Result, MAX_PATH);
    if SHGetPathFromIdList (IdList, PChar (Result)) then
      begin
        SetLength (Result, StrLen (PChar (Result)));
        Result := IncludeTrailingPathDelimiter (Result);
      end
    else Result := '';
  end; // PIdlToPath

  { ************************************************************ }
  function PidlFree (var IdList: PItemIdList): Boolean;
  { ************************************************************ }
  var
    Malloc : IMalloc;
  begin
    Result := False;
    if IdList = nil then
      Result := True
    else begin
           if Succeeded (SHGetMalloc (Malloc)) and (Malloc.DidAlloc (IdList) > 0) then
             begin
               Malloc.Free (IdList);
               IdList := nil;
               Result := True;
             end;
         end;
  end; // PidlFree

var
  FolderPidl : PItemIdList;
begin
  Result := '';
  try
    if Succeeded (SHGetSpecialFolderLocation (0, AFolder, FolderPidl)) then
      begin
        Result := PidlToPath (FolderPidl);
        PidlFree (FolderPidl);
      end;
  except
    Result := '';
  end;
end; // GetSpecialPath

User_Documents_Path := GetSpecialPath(CSIDL_COMMON_DOCUMENTS);

markus5766h 11. Mai 2011 17:30

AW: "User" Dokumente Verzeichnis finden
 
Code:
function GetSpecialFolder (aFolder: Integer): String;                                                                            // Unit ShlObj.pas
  pIdL: PItemIDList;
  Path: Array [0..Max_Path] Of Char;
  Allocator: IMalloc;
begin
  // ItemIdList für den Ordner holen
  SHGetSpecialFolderLocation (0, aFolder, pIdL);

  // ItemIdList in String umwandeln lassen
  SHGetPathFromIDList (pIDL, Path);

  // Speicher wieder freigeben
  if Succeeded (SHGetMalloc (Allocator)) then
    begin
      Allocator.Free (pIdL);
      {$IFDEF VER100}
      Allocator.Release;
      {$ENDIF}
    end;

  Result := Path;
end;
Unit ShlObj.pas

GetSpecialFolder(CSIDL_[irgend was]);

hab jetzt leider nicht die zutreffende
Bezeichnung parat,
aber als Schleife (i := 0 to 255) mit
GetSpecialFolder(i) sollte sich das rausfinden lassen.

. . . ups, da war jemand schneller

Der.Kaktus 11. Mai 2011 17:30

AW: "User" Dokumente Verzeichnis finden
 
guckst Du hier :-) environment

Dunkelbunt27 11. Mai 2011 17:33

AW: "User" Dokumente Verzeichnis finden
 
Ah, danke.
Ich schau mal ob's geht.

@ nuclearping
Danke, es funktioniert. Es führt mich aber zu C:\Users\Public\Documents. Mit CSIDL_MYDOCUMENTS Kommt man zu C:\Users/User\Documents.

Sir Rufo 11. Mai 2011 19:37

AW: "User" Dokumente Verzeichnis finden
 
Für den Sorglos-Zugriff gibt es Link: SpecialFolders
oder auch das hier

ringli 11. Mai 2011 19:37

AW: "User" Dokumente Verzeichnis finden
 
Auch wenn die Frage scheinbar schon beantwortet ist: Ab Vista sollte nur noch die Funktion MSDN-Library durchsuchenSHGetKnownFolderPath verwendet werden. SHGetSpecialFolderLocation ist eigentlich nur noch aus Kompatibilitätsgründen vorhanden. Hier habe ich mal eine entsprechende Unit gepostet mit der du die Funktion einfach benutzen kannst.

[EDIT]
Die passende Konstante lautet in deinem Fall übrigens FOLDERID_Documents.

nuclearping 12. Mai 2011 13:55

AW: "User" Dokumente Verzeichnis finden
 
Zitat:

Zitat von markus5766h (Beitrag 1100247)
. . . ups, da war jemand schneller

Trotzdem würde ich deine Version nehmen, da sie um einiges kürzer ist. :thumb:


Alle Zeitangaben in WEZ +1. Es ist jetzt 23:08 Uhr.

Powered by vBulletin® Copyright ©2000 - 2025, Jelsoft Enterprises Ltd.
LinkBacks Enabled by vBSEO © 2011, Crawlability, Inc.
Delphi-PRAXiS (c) 2002 - 2023 by Daniel R. Wolf, 2024-2025 by Thomas Breitkreuz