четверг, 22 января 2015 г.

Путь к пользовательской папке (shellpath.dll)

В Windows 7 может возникнуть проблема с записью файлов в папки, у которых нет разрешений на изменения. Куда сохранять пользовательские файлы?

Для этого есть специальная папка в Windows.

Кажется до Windows 7 это была
     C:\Documents and Settings\username\Application Data 
в Windows 7
    C:\Documents and Settings\username\AppData\Roaming

Как узнать эту папку программно?

function GetSpecialPath(CSIDL: word): string;
var
 Path:  PChar;
begin
 Result := '';
 GetMem(Path, MAX_PATH);
 try
   SHGetSpecialFolderPath(0, Path, CSIDL, False);
   Result := Trim(StrPas(Path));
   if Result <> '' then
     Result := IncludeTrailingPathDelimiter(Result);
 finally
   FreeMem(Path, MAX_PATH);
 end;
end;

Нужно знать CSIDL папки. Для нашей папки это CSIDL_APPDATA. Ну что же, узнаем эту папку?

Function GetAppDataPath: string;
begin
  result := GetSpecialPath(CSIDL_APPDATA);
end;

P.S. Так можно узнать пути всех системных папок. Надо добавить ShlObj в секцию USED. Вот для справки:

const

  // Следующие идентификаторы имеются в модуле ShlObj:

  CSIDL_DESKTOP                       = $0000;
  // Виртуальный каталог, представляющий Рабочий стол. (Корень в проводнике)

  CSIDL_INTERNET                      = $0001;
  // Виртуальный каталог для Internet Explorer.

  CSIDL_PROGRAMS                      = $0002;
  // Меню Пуск -> Ппрограммы

  CSIDL_CONTROLS                      = $0003;
  // Виртуальный каталог, содержащий иконки пунктов панели управления

  CSIDL_PRINTERS                      = $0004;
  // Виртуальный каталог, содержащий установленные принтеры

  CSIDL_PERSONAL                      = $0005;
  // Виртуальный каталог, представляющий папку "Мои документы"
  // До Vista ссылался на каталог "Мои документы" на жёстком диске

  CSIDL_FAVORITES                     = $0006;
  // Избранное. (обычно C:\Documents and Settings\username\Favorites)

  CSIDL_STARTUP                       = $0007;
  // Пуск -> Ппрограммы -> Автозагрузка

  CSIDL_RECENT                        = $0008;
  // Недавние документы (обычно C:\Documents and Settings\username\My Recent Documents
  // Для добавления ссылки документа используйте SHAddToRecentDocs

  CSIDL_SENDTO                        = $0009;
  // Папка, содержащая ярлыки меню "Отправить" (Sent to...) (обычно C:\Documents and Settings\username\SendTo)

  CSIDL_BITBUCKET                     = $000a;
  // Виртуальный каталог, содержащий файлы в корзине текущего пользователя

  CSIDL_STARTMENU                     = $000b;
  // Элементы меню Пуск текущего пользователя (обычно C:\Documents and Settings\username\Start Menu)

  CSIDL_DESKTOPDIRECTORY              = $0010;
  // Рабочий стол текущего пользователя (обычно C:\Documents and Settings\username\Desktop)

  CSIDL_DRIVES                        = $0011;
  // Виртуальный каталог, представляющий папку "Мой компьютер"

  CSIDL_NETWORK                       = $0012;
  // Виртуальный каталог, представляющий "Сетевое окружение"

  CSIDL_NETHOOD                       = $0013;
  // Папка "My Nethood Places" (обычно C:\Documents and Settings\username\NetHood)
  // В неё ссылки на избранные расширенные ресурсы

  CSIDL_FONTS                         = $0014;
  // Папка, содержащая установленные шрифты. (обычно C:\Windows\Fonts)

  CSIDL_TEMPLATES                     = $0015;
  // Шаблоны документов. (Обычно Settings\username\Templates)

  CSIDL_COMMON_STARTMENU              = $0016;
  // Элементы меню Пуск для всех пользователей. (обычно C:\Documents and Settings\All Users\Start Menu)
  // Константы, начинающиеся на CSIDL_COMMON_ существуют только в NT версиях

  CSIDL_COMMON_PROGRAMS               = $0017;
  // Меню Пуск -> ппрограммы для всех пользователей (обычно C:\Documents and Settings\All Users\Start Menu\Programs)

  CSIDL_COMMON_STARTUP                = $0018;
  // Меню Пуск -> Ппрограммы -> Автозагрузка для всех пользователей (обычно C:\Documents and Settings\All Users\Start Menu\Programs\Startup)

  CSIDL_COMMON_DESKTOPDIRECTORY       = $0019;
  // Элементы Рабочего стола для всех пользователей (обычно C:\Documents and Settings\All Users\Desktop)

  CSIDL_APPDATA                       = $001a;
  // Папка, в которой программы должны хранить свои данные(C:\Documents and Settings\username\Application Data)

  CSIDL_PRINTHOOD                     = $001b;
  // Установленные принтеры. (обычно C:\Documents and Settings\username\PrintHood)

  CSIDL_ALTSTARTUP                = $001d;         // DBCS
  // user's nonlocalized Startup program group. Устарело.

  CSIDL_COMMON_ALTSTARTUP         = $001e;         // DBCS
  // Устарело

  CSIDL_COMMON_FAVORITES          = $001f;
  // Ссылки "Избранное" для всех пользователей

  CSIDL_INTERNET_CACHE            = $0020;
  // Временные Internet файлы (обычно C:\Documents and Settings\username\Local Settings\Temporary Internet Files)

  CSIDL_COOKIES                   = $0021;
  // Папка для хранения Cookies (обычно C:\Documents and Settings\username\Cookies)

  CSIDL_HISTORY                   = $0022;
  // Хранит ссылки интернет истории IE

  // Следующих идентификаторов нет в ShlObj:
  CSIDL_ADMINTOOLS                = $30;
  // Административные инструменты текущего пользователя (например консоль MMC). Win2000+

  CSIDL_CDBURN_AREA               = $3b;
  // Папка для файлов, подготовленных к записи на CD/DVD
  // (Обычно C:\Documents and Settings\username\Local Settings\Application Data\Microsoft\CD Burning)

  CSIDL_COMMON_ADMINTOOLS         = $2f;
  // Папка, содержащая инструменты администрирования

  CSIDL_COMMON_APPDATA            = $23;
  // Папака AppData для всех пользователей. (обычно C:\Documents and Settings\All Users\Application Data)

  CSIDL_COMMON_DOCUMENTS          = $2e;
  // Папка "Общие документы" (обычно C:\Documents and Settings\All Users\Documents)

  CSIDL_COMMON_TEMPLATES          = $2d;
  // Папка шаблонов документов для всех пользователей (Обычно C:\Documents and Settings\All Users\Templates)

  CSIDL_COMMON_MUSIC              = $35;
  // Папка "Моя музыка" для всех пользователей. (обычно C:\Documents and Settings\All Users\Documents\My Music)

  CSIDL_COMMON_PICTURES           = $36;
  // Папка "Мои рисунки" для всех пользователей. (обычно C:\Documents and Settings\All Users\Documents\My Pictures)

  CSIDL_COMMON_VIDEO              = $37;
  // Папка "Моё видео" для всех пользователей (C:\Documents and Settings\All Users\Documents\My Videos)

  CSIDL_COMPUTERSNEARME           = $3d;
  // Виртуальная папка, представляет список компьютеров в вашей рабочей группе

  CSIDL_CONNECTIONS               = $31;
  // Виртуальная папка, представляет список сетевых подключений

  CSIDL_LOCAL_APPDATA             = $1c;
  // AppData для приложений, которые не переносятся на другой компьютер (обычно C:\Documents and Settings\username\Local Settings\Application Data)

  CSIDL_MYDOCUMENTS               = $0c;
  // Виртуальный каталог, представляющий папку "Мои документы"

  CSIDL_MYMUSIC                   = $0d;
  // Папка "Моя музыка"

  CSIDL_MYPICTURES                = $27;
  // Папка "Мои картинки"

  CSIDL_MYVIDEO                   = $0e;
  // Папка "Моё видео"

  CSIDL_PROFILE                   = $28;
  // Папка пользователя (обычно C:\Documents and Settings\username)

  CSIDL_PROGRAM_FILES             = $26;
  // Папка Program Files (обычно C:\Program Files)

  CSIDL_PROGRAM_FILESX86          = $2a;

  CSIDL_PROGRAM_FILES_COMMON      = $2b;
  // Папка Program Files\Common (обычно C:\Program Files\Common)

  CSIDL_PROGRAM_FILES_COMMONX86   = $2c;

  CSIDL_RESOURCES                 = $38;
  // Папка для ресурсов. Vista и выше (обычно C:\Windows\Resources)

  CSIDL_RESOURCES_LOCALIZED       = $39;

  CSIDL_SYSTEM                    = $25;
  // Папака System (обычно C:\Windows\System32 или C:\Windows\System)

  CSIDL_SYSTEMX86                 = $29;

  CSIDL_WINDOWS                   = $24;
  // Папка Windows. Она же %windir% или %SYSTEMROOT% (обычно C:\Windows)


Готовая библиотека (только AppData)

1 комментарий:

  1. "P.S. Так можно узнать пути всех системных папок. Надо добавить ShlObj в секцию USED."

    в USES, КАРЛ

    ОтветитьУдалить