1261 / 799 / 108
Регистрация: 16.09.2009
Сообщений: 2,010
|
|||||||||||||||||||||
1 | |||||||||||||||||||||
Получение путей к системным каталогам23.06.2010, 13:54. Показов 12663. Ответов 2
Метки нет (Все метки)
Получение путей к системным каталогам.
Появление этого поста связано с одной из стандартных проблем, любого программиста работающего под windows, проблема называется: зависимость от путей файлов, каталогов, в операционной системе. Рано или поздно такие проблемы возникают у программиста, он должен знать средство абстракции от путей к папкам и файлам. Простой жизненный пример: Программист, решил понадеется что на windows XP(Vista и.т.д.) папка program files всегда и везде(на любом ПК) находиться здесь: C:\Program Files и установил папку со своей программой имменно туда, и работа с файлами в его программе была связана с путем C:\Program File\My prog\data но прошло время и человек задумался, а если системная папка может находиться на диске D, D:\Program Files, вот тут и есть суть проблемы, программисту: нужно некое средство определяющее пути системных директорий ОС. И так теперь перейдем к сути: Для абстрагирования от системных путей нужны: всего лишь файл: "shlobj.h": одна функция , и идентификаторы. Прототип функции получения системных путей:
http://msdn.microsoft.com/en-u... S.85).aspx Два важных параметра: LPSTR - буфер для хранения полученного пути, csidl - идентификатор системной папки, путь к которой хотим получить. Я привел два примера,что бы понять, как можно использовать данную функцию: 1 - простой пример: показан вызов функции для получение пути системного каталога, так же показано как можно склеивать строки ,что бы получить конкретный путь к файлу, склеивать строки можно и без объектов типа string, мне просто удобней работать с CString и string. 2 - пример, это более интересная программа написанная в обобщенном виде при помощи templates. Коды проверены на VS2008. Заголовочный файл: stdafx в данном примере особо не нужен, просто я создал стандартное приложение и среда разработки навязала мне этот файл. Ниже приведен список допустимых значений: для параметра: csidl Список идентифиаторов системных папок:
//-----------------------------------------------------------------------------------------------------
Список идентификаторов: // Следующие идентификаторы имеются в "ShlObj.h" #define CSIDL_DESKTOP 0x0000 // Виртуальный каталог, представляющий Рабочий стол. (Корень в проводнике) #define CSIDL_INTERNET 0x0001 // Виртуальный каталог для Internet Explorer. #define CSIDL_PROGRAMS 0x0002 // Меню Пуск -> Программы #define CSIDL_CONTROLS 0x0003 // Виртуальный каталог, содержащий иконки пунктов панели управления #define CSIDL_PRINTERS 0x0004 // Виртуальный каталог, содержащий установленные принтеры #define CSIDL_PERSONAL 0x0005 // Виртуальный каталог, представляющий папку "Мои документы" // До Vista ссылался на какталог "Мои документы" на жёстком диске #define CSIDL_FAVORITES 0x0006 // Избранное. (обычно C:\Documents and Settings\username\Favorites) #define CSIDL_STARTUP 0x0007 // Пуск -> Программы -> Автозагрузка #define CSIDL_RECENT 0x0008 // Недавние документы (обычно C:\Documents and Settings\username\My Recent Documents // Для добавления ссылки документа используйте SHAddToRecentDocs #define CSIDL_SENDTO 0x0009 // Папка, содержащая ярлыки меню "Отправить" (Sent to...) (обычно C:\Documents and Settings\username\SendTo) #define CSIDL_BITBUCKET 0x000a // Виртуальный каталог, содержащий файлы в корзине текущего пользователя #define CSIDL_STARTMENU 0x000b // Элементы меню Пуск текущего пользователя (обычно C:\Documents and Settings\username\Start Menu) #define CSIDL_DESKTOPDIRECTORY 0x0010 // Рабочий стол текущего пользователя (обычно C:\Documents and Settings\username\Desktop) #define CSIDL_DRIVES 0x0011 // Виртуальный каталог, представляющий папку "Мой компьютер" #define CSIDL_NETWORK 0x0012 // Виртуальный каталог, представляющий "Сетевое окружение" #define CSIDL_NETHOOD 0x0013 // Папка "My Nethood Places" (обычно C:\Documents and Settings\username\NetHood) // В неё ссылки на избранные расшаренные ресурсы #define CSIDL_FONTS 0x0014 // Папка, содержащая установленные шрифты. (обычно C:\Windows\Fonts) #define CSIDL_TEMPLATES 0x0015 // Шаблоны документов. (Обычно Settings\username\Templates) #define CSIDL_COMMON_STARTMENU 0x0016 // Элементы меню Пуск для всех пользователей. (обычно C:\Documents and Settings\All Users\Start Menu) // Константы, начинающиеся на CSIDL_COMMON_ существуют только в NT версиях #define CSIDL_COMMON_PROGRAMS 0x0017 // Меню Пуск -> программы для всех пользователей (обычно C:\Documents and Settings\All Users\Start Menu\Programs) #define CSIDL_COMMON_STARTUP 0x0018 // Меню Пуск -> Программы -> Автозагрузка для всех пользователей (обычно C:\Documents and Settings\All Users\Start Menu\Programs\Startup) #define CSIDL_COMMON_DESKTOPDIRECTORY 0x0019 // Элементы Рабочего стола для всех пользователей (обычно C:\Documents and Settings\All Users\Desktop) #define CSIDL_APPDATA 0x001a // Папка, в которой рограммы должны хранить свои данные(C:\Documents and Settings\username\Application Data) #define CSIDL_PRINTHOOD 0x001b // Установленные принтеры. (обычно C:\Documents and Settings\username\PrintHood) #define CSIDL_ALTSTARTUP 0x001d // DBCS // user's nonlocalized Startup program group. Устарело. #define CSIDL_COMMON_ALTSTARTUP 0x001e // DBCS // Устарело #define CSIDL_COMMON_FAVORITES 0x001f // Ссылки "Избранное" для всех пользователей #define CSIDL_INTERNET_CACHE 0x0020 // Временные Internet файлы (обычно C:\Documents and Settings\username\Local Settings\Temporary Internet Files) #define CSIDL_COOKIES 0x0021 // Папка для хранения Cookies (обычно C:\Documents and Settings\username\Cookies) #define CSIDL_HISTORY 0x0022 // Хранит ссылки интернет истории IE #define CSIDL_ADMINTOOLS 0x0030 // Административные инструменты текущего пользователя (например консоль MMC). Win2000+ #define CSIDL_CDBURN_AREA 0x003b // Папка для файлов, подготовленных к записи на CD/DVD // (Обычно C:\Documents and Settings\username\Local Settings\Application Data\Microsoft\CD Burning) #define CSIDL_COMMON_ADMINTOOLS 0x002f // Папка, содержащая инструменты администрирования #define CSIDL_COMMON_APPDATA 0x0023 // Папака AppData для всех пользователей. (обычно C:\Documents and Settings\All Users\Application Data) #define CSIDL_COMMON_DOCUMENTS 0x002e // Папка "Общие документы" (обычно C:\Documents and Settings\All Users\Documents) #define CSIDL_COMMON_TEMPLATES 0x002d // Папка шаблонов документов для всех пользователей (Обычно C:\Documents and Settings\All Users\Templates) #define CSIDL_COMMON_MUSIC 0x0035 // Папка "Моя музыка" для всех пользователей. (обычно C:\Documents and Settings\All Users\Documents\My Music) #define CSIDL_COMMON_PICTURES 0x0036 // Папка "Мои рисунки" для всех пользователей. (обычно C:\Documents and Settings\All Users\Documents\My Pictures) #define CSIDL_COMMON_VIDEO 0x0037 // Папка "Моё видео" для всех пользователей (C:\Documents and Settings\All Users\Documents\My Videos) #define CSIDL_COMPUTERSNEARME 0x003d // Виртуальная папка, представляет список компьютеров в вашей рабочей группе #define CSIDL_CONNECTIONS 0x0031 // Виртуальная папка, представляет список сетевых подключений #define CSIDL_LOCAL_APPDATA 0x001c // AppData для приложений, которые не переносятся на другой компьютер (обычно C:\Documents and Settings\username\Local Settings\Application Data) #define CSIDL_MYDOCUMENTS CSIDL_PERSONAL // Виртуальный каталог, представляющий папку "Мои документы" #define CSIDL_MYMUSIC 0x000d // Папка "Моя музыка" #define CSIDL_MYPICTURES 0x0027 // Папка "Мои картинки" #define CSIDL_MYVIDEO 0x000e // Папка "Моё видео" #define CSIDL_PROFILE 0x0028 // Папка пользователя (обычно C:\Documents and Settings\username) #define CSIDL_PROGRAM_FILES 0x0026 // Папка Program Files (обычно C:\Program Files) #define CSIDL_PROGRAM_FILESX86 0x002a #define CSIDL_PROGRAM_FILES_COMMON 0x002b // Папка Program Files\Common (обычно C:\Program Files\Common) #define CSIDL_PROGRAM_FILES_COMMONX86 0x002c #define CSIDL_RESOURCES 0x0038 // Папка для ресерсов. Vista и выше (обычно C:\Windows\Resources) #define CSIDL_RESOURCES_LOCALIZED 0x0039 #define CSIDL_SYSTEM 0x0025 // Папака System (обычно C:\Windows\System32 или C:\Windows\System) #define CSIDL_SYSTEMX86 0x0029 #define CSIDL_WINDOWS 0x0024 // Папка Windows. Она же %windir% или %SYSTEMROOT% (обычно C:\Windows) //------------------------------------------------------------------------------------------------------ Исходный код первой программы: Код:
Суть кода такова есть имя: файла не путь: оно задается пользовательской программой. путь к самой папке: где будет сохранен файл, уже известен: нам прописывать его не надо, так же можно не беспокоиться: на каком диске расположена системная директория, функция: SHGetSpecialFolderPath знает где находиться системная директория: именно это и абстрагирует нас от особенностей местоположения каталогов. Вот так выглядит стандартный путь(в программе выше) к папке с файлом: C:\Program Files\My folder\data Что бы пример сработал корректно: надо создать папки My folder и data. Небольшое отступление от темы: программисту: помимо средств абстракции от путей каталогов: нужны средства установки программ: так называемые установщики(инсталляторы). Суть установщика скопировать упакованные файлы вашей программы: в определенные вами директории(инсталлятор создает нужные директории если их нет в файловой системе). Из инструментов для создания инсталляторов могу посоветовать: InstallShield 10.5 или новее, отличное средство быстрого создания инсталляторов, это не реклама, а совет. Исходный код второй программы: Код:
Пояснения термина: Клиент - часть кода использующая: некую другую часть кода: процедуры, конструкторы и.т.д короче говоря, все то что может выполняться. Суть кода: следующая: Имеется массив строк, и меню для работы с этим массивом: с помощью меню мы можем сохранять, загружать массив, заполнять, выводить. Подробная суть кода есть в комментариях, повторяться не буду, важный момент: это то, что мы не имеем дело с путями, клиент не должен предоставлять путей файлов, клиент должен предоставлять только имена файлов, путь к каталогу известен заранее: и он всегда правильный потому, как система определяет букву диска(и саму sys директорию) на котором находиться системная директория. ////////////////////////////////////////////////////////////////// А если системная директория в какой-нибудь версии Windows, вдруг перестала называться Program Files, тогда важность использования SHGetSpecialFolderPath возрастает в разы. Обычный пример из жизни: в одной ОС Windows системная папка тут: C:\WINNT\SYSTEM32 а в другой ОС WIndows здесь: C:\WINDOWS\system32 От такой зависимости можно избавиться используя: SHGetSpecialFolderPath /////////////////////////////////////////////////////////////////// Вот так выглядит стандартный путь, к папке, с которой связан процесс загрузки и сохранения ,во втором коде. C:\Program Files\My Prog\MyData Для работы приложения следует создать папки My Prog и MyData Примечание к функциям save и proc: если клиент передаст путь, а не имя файла, естественно процесс сохранения или загрузки не произойдет. Еще одно примечание: если в пути присутствуют русские буквы, надо преобразовывать весь путь в WCHAR, может особенность какая то, но в VS2008 ofstream и ifstream не открывают файл если в пути присутствуют русские буквы, если преобразовать в WCHAR то все ok. О функции преобразования: MultiByteToWideChar: http://msdn.microsoft.com/en-u... 02786.aspx Я думаю, что без MultiByteToWideChar ofstream и ifstream лучше не использовать. Пример к данному примечанию ниже: Код:
Путь к целевому каталогу данной программы: где будет храниться файл(файлы) у меня таков: C:\Documents and Settings\Ignat\Мои документы\My folder\data У вас: заместо Ignat будет стоять скорее всего другое имя. Вывод к сказанному: Функция SHGetSpecialFolderPath предоставляет программисту независимость от разположения системных каталогов, следовательно гарантированна, корректная работа его приложений, установленных в системные каталоги. О ShellExecute : Это функция для запуска приложений и документов. ShellExecute: http://msdn.microsoft.com/en-u... S.85).aspx Как использовать: ShellExecute: http://otvety.google.ru/otvety... a9eb7b7ddd Без SHGetSpecialFolderPath, функцию ShellExecute использовать, думаю не имеет смысла, почему: можно понять прочитав весь пост. Просьба к форумчанам: В теме можете постить, все что связанно с тематикой, может вы знаете, еще варианты как избавиться от sys путей - зависимостей.
0
|
23.06.2010, 13:54 | |
Ответы с готовыми решениями:
2
Получение доступа к системным каталогам Получение пути к системным папкам через hexadecimal значение Получение полных путей файлов Получение списка путей процессов |
7175 / 3234 / 81
Регистрация: 17.06.2009
Сообщений: 14,164
|
|
23.06.2010, 21:21 | 2 |
Чтобы это сработало программа должна быть запущена из-под админа Потому что из-под обычного юзера писать в С:\Program Files\ не очень правильная мысль Может стоило ограничиться примером на чтение из этого каталога ? Или указать что надо запускать из-под админа ? 1) Берем идентификатор 2) Получаем путь для него 3) Выводим на экран путь, идентификатор и комментарий к нему (что это собственно такое) Попутно правильно обрабатываем ошибки (не все идентификаторы везде есть) Получается такая демо-программа которая демонстирует какие пути на данном компе
1
|
1261 / 799 / 108
Регистрация: 16.09.2009
Сообщений: 2,010
|
|
24.06.2010, 10:34 [ТС] | 3 |
Спасибо за замечания.
0
|
24.06.2010, 10:34 | |
24.06.2010, 10:34 | |
Помогаю со студенческими работами здесь
3
Получение путей папок и подпапок Получение путей выделеных пунктов ShellTreeView Получение списка путей к фотографиям девайса Поиск файлов в папке и получение путей к ним (консоль) Искать еще темы с ответами Или воспользуйтесь поиском по форуму: |