Главная arrow IDE Delphi arrow Узнать пути к стандартным папкам  
10.02.2012
Главное меню
Главная
Лаборатория
Книги по дельфи
Инструменты
Статьи
Видео
Юмор
Ссылки
Поиск
База знаний Delphi
Общие вопросы
Windows, WinAPI
Графика, Звук
IDE Delphi
Консоль
Авторизация





Забыли пароль?
Вы не зарегистрированы. Регистрация
Каталог@Mail.ru - каталог ресурсов интернет
Узнать пути к стандартным папкам Версия для печати
Рейтинг: / 33
ХудшаяЛучшая 
Написал 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;
Добавить новыйПоиск
Akella - CSIDL_MYDOCUMENTS   2009-07-13 13:08:57
GetSpecialPath( CSIDL_MYDOCUMENTS )
возвращает пустую строку (Windows XP)
Venyaminich - Тоже самое   2009-06-22 21:14:31
Тоже возвращает
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)
Vervolf   2010-12-10 02:12:34
:woohoo: все идеально работает, спасибо!
Evdokiyushka   2011-06-03 16:04:03
Написано доходчиво, у меня пошло! :)
Lara   2011-06-03 16:05:24
А у меня че-то не идет :(
Иван   2012-01-23 00:04:54
App Data на 7-ке некорректно определяется с как AppData\Roaming :( :( :( :( :(
Grey - '   2012-01-27 05:02:29
Мой компьютер" и "Корзина" не работают :(
JoseKJ   2012-02-09 17:43:08
[url=http://moya-strojka.ru/tag/reklamnoe-agentstvo]
комментарии
Имя:
Заголовок:
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
Пожалуйста, введите проверочный код, который Вы видите на картинке.
 
< Пред.   След. >