Главная arrow Windows, WinAPI arrow Узнать пути к стандартным папкам  
03.09.2010
Главное меню
Главная
Лаборатория
Книги по дельфи
Инструменты
Статьи
Видео
Юмор
Поиск
Новости
Лента новостей
Новости Delphi
Новости проекта
Новости инструментов
Разные новости
База знаний Delphi
Общие вопросы
Windows, WinAPI
Графика, Звук
IDE Delphi
Консоль
Каталог@Mail.ru - каталог ресурсов интернет
комментарии
Узнать пути к стандартным папкам Версия для печати
Рейтинг: / 26
ХудшаяЛучшая 
Написал Snowy   
09.09.2007
В Windows есть специальная функция, позволяющая получить пути к стандартным папкам.
В Delphi это будет выглядеть так:
uses ShlObj;
 
function GetSpecialPath(CSIDL: word): string;
var s:  string;
begin
  SetLength(s, MAX_PATH);
  if not SHGetSpecialFolderPath(0, PChar(s), CSIDL, true)
  then s := '';
  result := PChar(s);
end;
Функции нужно передать id папки, путь которой хотим получить. Список id идёт далее.
Следует помнить, что не все id будуть работать в разных версиях Windows. Например папки 'Documents & Settungs' нет в 98-х и бессмысленно пытаться получить путь к ней.
Смысл данного поста скорее не в том, чтобы показать, как пользоваться функцией SHGetSpecialFolderPath, а, скорее, дать перечень CSIDL и описание к ним на русском.

Вот полный код:
uses ShlObj;
 
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)
 
function GetSpecialPath(CSIDL: word): string;
var s:  string;
begin
  SetLength(s, MAX_PATH);
  if not SHGetSpecialFolderPath(0, PChar(s), CSIDL, true)
  then s := GetSpecialPath(CSIDL_APPDATA);
  result := PChar(s);
end;
опубликовано
Добавить новыйПоиск
Snowy   2009-06-23 20:52:39
Мои документы - CSIDL_PERSONAL
А CSIDL_MYDOCUMENTS возвращает пустоту, видимо потому, что иконка моих документов удалена с рабочего стола и более не существует.
Donya     2009-11-11 14:50:53
А как относительно последней версии, там это работает?
Sasha - работает     2009-11-22 19:50:02
У меня все работает!
Volya     2009-11-25 13:53:18
А в последней версии Виндовс работает?
Snowy   2009-11-25 15:48:30
Работает
Malaniya - Узнать пути к стандартным папк     2009-12-12 18:13:37
У меня тоже работает.
antonim     2009-12-14 13:12:48
ее работает)))
Milusya     2009-12-27 00:23:49
Спасибо, иногда нужно бывает их из проги узнать. В 7-ке тоже корректно определяет нужные папки.
Katyusya     2009-12-29 10:24:53
Работает на все 100.
Dekabrist     2010-01-27 14:57:02
Работать то работает, но не совсем на 100.
Tanyura - вукен     2010-02-01 18:31:31
как раз интересовал
Lyubov     2010-04-03 16:34:47
Мне кажется что тут еще не все до конца продумано.
Анонимно   2010-04-07 11:48:50
Жаль у меня не прокатывает - сделал свою службу, и т.к. она запускается от системной учетной записи - возвращает не правильный путь (рабочего стола, к примеру). От конкретной учетки запускать тоже не могу - служба устанавливается на ряд компьютеров, и учетка везде своя.
phoner     2010-05-04 14:22:56
Спасибо, какраз искал решение на Дельфи такой ситуации.
Emmanuil     2010-05-13 13:34:45
Любаша, а что бы вам еще хотелось бы?
Alex   2010-07-07 19:08:43
У меня константа CSIDL_PROGRAM_FILES не нашлась, а её численный эквивалент ($26) сработал.
w.i.d.g.e.t.1   2010-07-07 21:54:46
Хоть убейте, все компилится, но не засыпает, не на ридлн не реагирует. Секунда консоли и все. И подчеркивает компилятор ошибку, не пишет какая, а красным черкает на end. (с точкой)...чего ему надобно, что запинается?..заранее благодарна!
Snowy   2010-07-09 13:19:09
Значит где-то не закрыта пара begin-end.
Рекомендую установить CnWizards - с ним визуально видны пары - будет проще найти.
Artem - Круто     2010-08-25 12:50:09
Работает, ура :evil:
Сергей     2010-08-25 12:51:46
то что нужно, спасибо
Webber     2010-08-25 12:53:08
цитата:
А в последней версии Виндовс работает?

Да работает B)
Добавить комментарий
Имя:
Веб-сайт:
Заголовок:
UBB-Код:
[b] [i] [u] [url] [quote] [code] [img] 
 
 
:angry::0:confused::cheer:B):evil::silly::dry::lol::kiss::D:pinch:
:(:shock::X:side::):P:unsure::woohoo::huh::whistle:;):s
:!::?::idea::arrow:
 
Security Image
Пожалуйста, введите проверочный код, который Вы видите на картинке.
 
< Пред.   След. >