Получить путь к папке "Мои документы" в delphi

я использую следующий код для получения специальных каталогов

uses
  ActiveX, ShlObj;

{...}

procedure TForm1.Button1Click(Sender: TObject);
// Replace CSIDL_HISTORY with the constants below
var
  Allocator: IMalloc;
  SpecialDir: PItemIdList;
  FBuf: array[0..MAX_PATH] of Char;
  PerDir: string;
begin
  if SHGetMalloc(Allocator) = NOERROR then
  begin
    SHGetSpecialFolderLocation(Form1.Handle, CSIDL_PERSONAL, SpecialDir);
    SHGetPathFromIDList(SpecialDir, @FBuf[0]);
    Allocator.Free(SpecialDir);
    ShowMessage(string(FBuf));
  end;
end;

И теперь я хочу получить путь к моим документам поэтому я использую mydocfolderpath: = string (FBuf) + '\ Documents', и я думаю, что он работает хорошо но я сомневаюсь, что это путь mydocuments на всех ПК с Windows (personalfolder/documents), который пользователь может изменить эту структуру и сделать мою папку с документами anywhare else (например: c:\documents) если пользователь меняет путь, дайте мне правильный путь, и мне нравится знать, что такое имя папки mydocuments (Мои документы или документы)

Ответ 1

CSIDL_PERSONAL есть папка Мои документы:

CSIDL_PERSONAL FOLDERID_Documents Версия 6.0. Виртуальная папка, представляет рабочий стол My Documents пункт. Это эквивалентно CSIDL_MYDOCUMENTS.

Предыдущая версия 6.0. Файл системный каталог, используемый для физического хранить общий репозиторий пользователя документы. Типичный путь C:\Documents and Settings\имя_пользователя\My Документы. Это должно быть отличается от виртуального My Документы в пространстве имен. к доступ к этой виртуальной папке, используйте SHGetFolderLocation, которая возвращает ITEMIDLIST для виртуального расположения, или обратитесь к методу, описанному в Управление файловой системой. Управление файловой системой.

Смотрите: http://msdn.microsoft.com/en-us/library/bb762494(VS.85).aspx для списка и описания всех доступных констант CSIDL

Ответ 2

Если вы используете последнюю версию Delphi (XE5 или выше), вы можете использовать классы агностики новой платформы. В основном System.IOUtils System.IOUtils в uses, затем используйте TPath.GetDocumentsPath, чтобы получить папку с документами.

Просмотрите Doc Wiki