ścieżka do katalogu Documents and Settings

0

Witam
Czy wiecie może jak uzyskanie ścieżki do katalogu „C:\Documents and Settings”. A przede wszystkim czy jest to możliwe.

0

Czy zależy Ci konkretnie na tej, czy jej podścieżkach (z nazwami kont użytkowników)? Będzie to coś w stylu:

function GetSpecialFolderPath(Folder:integer):string;
var PIDL : PItemIDList;
    SelectedPath : array[0..MAX_PATH] of Char;
begin
result:='';
if (folder<>$FFFF) then
  begin
  PIDL:=nil;
  SHGetSpecialFolderLocation(GetDesktopWindow(), Folder, PIDL);
  if Assigned(PIDL) and SHGetPathFromIDList(PIDL, SelectedPath) then
    result := string(SelectedPath);
  end;
if (pos(':',result)=0) and (pos('\\',result)=0) then result:=ExtractFilePath(Application.ExeName);
IncludeTrailingPathDelimiter(result);
ForceDirectories(result);
end;

Powyższa funkcja wywołana z argumentem CSIDL_APPDATA zwraca katalog, gdzie programy powinny zapisywać swoje ustawienia:
C:\Documents and Settings{AKTUALNY UŻYTKOWNIK}\Dane aplikacji

Jeśli taka ścieżka nie funkcjonuje w systemie (Windows 9x) zwraca katalog, gdzie znajduje się aplikacja. Czasem, mimo, że katalog jest zdefiniowany, nie istnieje (z doświadczeń praktycznych okazało się to dosyć częste w Windows Me) musi zostać utworzony, Ta funkcja zapewnia również to. Każda zwracana ścieżka ma kończący backslash.

0

Właśnie o to chodzi że zależy mi konkretnie na samej ścieżce do katalogu „Documents and Settings”. Ostatecznie może być do „C:\Documents and Settings\All Users” bez nazwy użytkowników.

0

Teoretycznie w tym katalogu nie powinieneś niczego tam szukać. Może lepsza będzie dla Ciebie flaga: CSIDL_COMMON_APPDATA

C:\Documents and Settings\All users\Dane aplikacji

Pamiętaj, że na innych systemach Dane aplikacji nie muszą znajdować się w All users

0
uses ShlObj;

function GetFolderDocAndSett: string;
var
  s: string;
  Path: array[0..MAX_PATH] of Char;
begin
  SHGetSpecialFolderPath(0, Path, CSIDL_APPDATA , False);
  s := ExtractFilePath(Path);
  Delete(s,Length(s),Length(s));
  Result := ExtractFilePath(s);
end;

procedure TForm1.Button1Click(Sender: TObject);
begin
 ShowMessage(GetFolderDocAndSett);
end;
0

„Opi” Wielkie dzięki właśnie o to chodziło. Oczywiście „Szczawik” Też dzieki.
„Opi” swoją drogom nieźle to wykombinowałeś. Pozdrawiam. [browar]

0
Szczawik napisał(a)

Pamiętaj, że na innych systemach Dane aplikacji nie muszą znajdować się w All users

Dlatego sposób, który podał Opi, zapewne nie będzie działał ani na Win 9x, ani prawdopodobnie na Windows ME.

0
Szczawik napisał(a)
...
ForceDirectories(result);
...

Szczawik, poco tworzysz ten folder ? Tu należy pobrać jego lokalizację, a nie utworzyć, jeśli takiego folderu nie ma...

0

Rzecz w tym, że w niektórych wersjach (miałem ten problem m.in. na kilku świeżo zainstalowanych Windows 2000 angielskich) funkcja zwracała ścieżkę, niby poprawną, ale program nie działał. Okazało się, że zwracana ścieżka istniała tylko jako zapis w rejestrze, ale nie jako fizyczny katalog.

Warto przed tym się zabezpieczyć.

0

function Sciezka: String;
var
WDir : array[0..255] of char;
S : String
begin
GetWindowsDirectory(WDir, SizeOf(WDir));
S:= ExtractFileDrive(WDir);
S:= S+'\Documents and Settings';
Result := S;

i po wszystkiemu

0

Brawo puchi. A co, jeśli katalog nie nazywa się "Documents and Settings" tylko "Dokuments und Einstallungen" względnie w ogóle nazywa się "Users" lub "Użytkownicy", bo jest to system Vista (inna sprawa, że w Viście takie odwołanie zadziała, bo stworzono hardlinka o nazwie D&S)?

1 użytkowników online, w tym zalogowanych: 0, gości: 1