Newsgroup: it.comp.lang.delphi
Titolo: Variabile d'Ambiente

Salve ragazzi, ho il problema di dover leggere un file memorizzato nella
cartella documenti del computer (WinXP) come faccio a sapere la Path di tale
cartella?
Credo che devo leggere il valore di una variabile d'ambiente, quale? e come
fare?
A volte le cose che sembrano piu' semplici non si riesce a risolverle.  un
saluto a tutti.



 Path di tale cartella?
Devi utilizzare le funzioni Shell
http://kanadepro.com/delphistuff/sampcode.mv?listTipsScreen+5
Saluti.
-- 
I'am what I'am, I do what I can

Grande, era quello che cercavo grazie, Setec.

 tale cartella?
empiricamente ho trovato con regedit sul mio WinXp che la chiave di 
registro
HKEY_CURRENT_USER\Software\Microsoft\Windows\CurrentVersion\Explorer\User 
Shell Folders
contiene il path della cartella Documenti (sottochiave Personal), oltre 
che i Preferiti (sottochiave Favorites), la Cronologia (sottochiave 
Cache), i File Temporanei Internet (sottochiave History) e molti altri 
percorsi di cartelle di sistema.
Come esempio, sto usando questo metodo per leggere le informazioni:
program Main;
uses
  Windows, ShellAPI, Registry;
procedure RetrievePaths(var IECache, IEHistory: string);
var
  Reg: TRegistry;
const
  USER_FOLDERS = '\Software\Microsoft\Windows\CurrentVersion\Explorer\User 
Shell Folders';
begin
  IECache:= '';
  IEHistory:= '';
  Reg:= TRegistry.Create;
  with Reg do
    try
      RootKey:= HKEY_CURRENT_USER;
      if OpenKey(USER_FOLDERS, False) then
      begin
        IECache:= ReadString('Cache');
        IEHistory:= ReadString('History');
        CloseKey;
      end;
    finally
      Free
    end
end;
{procedure OpenFolder(const Path: TBuffer);
begin
  ShellExecute(0, 'open', Path, nil, nil, SW_RESTORE);
end;}
var
  Cache, History: string;
begin
  RetrievePaths(Cache, History);
  OutputDebugString(PChar(Cache));
  OutputDebugString(PChar(History));
end.
-- 
Mauro Falzari 
   [ 
http://digilander.libero.it/mauro.falzari
 ]
 
 "Se guardi nell'abisso, anche l'abisso guarda in te." 
   (Friedrich Nietzsche)

siccome la cosa interessava anche me, ho scritto una semplice espansione 
per le variabili d'ambiente (visto che alcuni percorsi di sistema, tipo
 
%USERPROFILE%\Impostazioni locali\Cronologia
ne contengono)
Qui sotto il programma completo: apre le cartelle di Cronologia, File 
Temporanei Internet, e ci ho aggiunto anche Documenti (anche se questo 
percorso si può ottenere più facilmente con la funzione API 
SHGetSpecialFolderLocation -vedi la guida dell'SDK)
program Main;
uses
  Windows, ShellAPI, Registry, SysUtils, StrUtils, Dialogs;
{$APPTYPE CONSOLE}
const
  KEY_USER_FOLDERS      = '\Software\Microsoft\Windows\CurrentVersion
\Explorer\User Shell Folders';
  SUBKEY_IE_CACHE       = 'Cache';
  SUBKEY_IE_HISTORY     = 'History';
  SUBKEY_DOCUMENTS      = 'Personal';
function FindEnvVariable(const Text: string): string;
{ restituisce la prima variabile d'ambiente (cioè il testo
  compreso tra %..%) incontrata in Text.
  Il risultato NON include i caratteri '%' }
var
  i: Integer;
  tmp: string;
const
  PERCENT_CHAR = '%';
begin
  Result:= '';
  tmp:= '';
  i:= Pos(PERCENT_CHAR, Text);
  if i > 0 then
    while i < Length(Text) do
    begin
      Inc(i);
      if Text[i] = PERCENT_CHAR then
      begin
        Result:= tmp;
        Break;
      end;
      tmp:= tmp + Text[i];
    end;
end;
procedure ExpandEnvVariable(var Text: string);
{ dato un testo nella forma:
   'testo qualsiasi%VARIABILE D'AMBIENTE%resto della stringa'
  -legge la prima stringa racchiusa tra i caratteri %,
  -se è il nome di una variabile d'ambiente
      sostituisce %VARIABILE D'AMBIENTE% con il contenuto di tale 
variabile }
var
  s: string;
begin
  s:= '%' + FindEnvVariable(Text) + '%';
  Text:= StringReplace(Text, s, GetEnvironmentVariable(FindEnvVariable
(Text)), [rfIgnoreCase])
end;
procedure RetrievePaths(var IECache, IEHistory, MyDocs: string);
var
  Reg: TRegistry;
begin
  IECache:= '';
  IEHistory:= '';
  MyDocs:= '';
  Reg:= TRegistry.Create;
  with Reg do
    try
      RootKey:= HKEY_CURRENT_USER;
      if OpenKey(KEY_USER_FOLDERS, False) then
      begin
        IECache:= ReadString(SUBKEY_IE_CACHE);
        ExpandEnvVariable(IECache);
        IEHistory:= ReadString(SUBKEY_IE_HISTORY);
        ExpandEnvVariable(IEHistory);
        MyDocs:= ReadString(SUBKEY_DOCUMENTS);
        ExpandEnvVariable(MyDocs);
        CloseKey;
      end;
    finally
      Free
    end
end;
procedure OpenFolder(const Path: string);
begin
  if Path <> '' then
    ShellExecute(0, 'open', PChar(Path), nil, nil, SW_NORMAL);
end;
var
  Cache, History, MyDocs: string;
begin
  RetrievePaths(Cache, History, MyDocs);
  OpenFolder(History);
  OpenFolder(Cache);
  OpenFolder(MyDocs);
