Форум программистов, компьютерный форум CyberForum.ru

C++

Войти
Регистрация
Восстановить пароль
 
Рейтинг: Рейтинг темы: голосов - 29, средняя оценка - 4.83
Genius Ignat
1235 / 773 / 44
Регистрация: 16.09.2009
Сообщений: 2,014
#1

Получение путей к системным каталогам - C++

23.06.2010, 13:54. Просмотров 3629. Ответов 2
Метки нет (Все метки)

Получение путей к системным каталогам.

Появление этого поста связано с
одной из стандартных проблем, любого программиста работающего под windows,
проблема называется: зависимость от путей файлов, каталогов, в операционной системе.
Рано или поздно такие проблемы возникают у программиста,
он должен знать средство абстракции от путей к папкам и файлам.

Простой жизненный пример:

Программист, решил понадеется что на windows XP(Vista и.т.д.) папка
program files всегда и везде(на любом ПК) находиться здесь: C:\Program Files
и установил папку со своей программой имменно туда, и работа
с файлами в его программе была связана с путем C:\Program File\My prog\data
но прошло время и человек задумался,

а если системная папка может находиться на диске D, D:\Program Files, вот тут и есть суть проблемы,
программисту: нужно некое средство определяющее пути системных директорий ОС.


И так теперь перейдем к сути:
Для абстрагирования от системных путей нужны:
всего лишь файл: "shlobj.h": одна функция , и идентификаторы.

Прототип функции получения системных путей:
C++
1
2
//Файл shlobj.h
SHSTDAPI_(BOOL) SHGetSpecialFolderPath(HWND hwnd, __out_ecount(MAX_PATH) LPSTR pszPath, int csidl, BOOL fCreate);
Более подробно про параметры и особенности: можете почитать здесь:
http://msdn.microsoft.com/en-us/libr...04(VS.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)

//------------------------------------------------------------------------------------------------------



Исходный код первой программы:
Код:

C++
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
#include "stdafx.h"
#include "shlobj.h"
 
#include <iostream>
#include <fstream>
#include <string>
 
using namespace std;
#pragma comment(lib,"shell32.lib")
 
int _tmain(int argc, _TCHAR* argv[])
{
     int mas[10] = {4,5,6,4,5,6,7,8,9,10};
     string name_file;       //имя текстового файла.
     cout<<"Enter name of file:   "; cin>>name_file;         //вводим имя файла: неполный путь.
     string path;                                //полный путь к файлу.
     char system_folder[MAX_PATH];          //системная директория.
     SHGetSpecialFolderPath(0,system_folder, CSIDL_PROGRAM_FILES,true);   //получаем системную директорию.
     //Собираем полный путь файла.
     path=system_folder;
     path+="\\My folder\\data\\";           //целевая папка: она должна существовать.       
     path+=name_file;                          //+ имя, все получили полный путь.
     ofstream save(path.c_str());           //открываем файл.
     if(!save)return -1;
     //Сохраняем массив в файл.
     unsigned long i(0);
     for( i = 0 ; i < 10 ; i++ )save<<mas[i]<<' ';
     save<<endl;
     return 0;
}

Суть кода такова есть имя: файла не путь: оно задается пользовательской программой.
путь к самой папке: где будет сохранен файл, уже известен:
нам прописывать его не надо, так же можно не беспокоиться:
на каком диске расположена системная директория,
функция: SHGetSpecialFolderPath знает где находиться системная директория:
именно это и абстрагирует нас от особенностей местоположения каталогов.

Вот так выглядит стандартный путь(в программе выше) к папке с файлом:
C:\Program Files\My folder\data
Что бы пример сработал корректно: надо создать папки My folder и data.
Небольшое отступление от темы:
программисту: помимо средств абстракции от путей каталогов: нужны средства установки программ:
так называемые установщики(инсталляторы).
Суть установщика скопировать упакованные файлы вашей программы:
в определенные вами директории(инсталлятор создает нужные директории если их нет в файловой системе).
Из инструментов для создания инсталляторов могу посоветовать: InstallShield 10.5 или новее,
отличное средство быстрого создания инсталляторов, это не реклама, а совет.


Исходный код второй программы:
Код:

C++
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
115
116
117
118
119
120
121
122
123
124
125
126
127
128
129
130
131
132
133
134
135
136
137
138
139
140
141
142
143
144
145
146
147
148
#include "stdafx.h"
#include "shlobj.h"
 
#include <iostream>
#include <fstream>
#include <string>
 
using namespace std;
#pragma comment(lib,"shell32.lib")
 
//Константы успешности.
const long M_ERROR = -1;
const long M_OK = 0; 
/////////////////////////////////////////////////////////////////////////////////////////
template<class T, class proc_inpt>
long input (T *m, unsigned long size, proc_inpt func);  //функция ввода некоего массива.
template<class T, class proc_prnt>
long print (const T *m, unsigned long size, proc_prnt func);  //Функция вывода некоего массива.
 
template<class T, class proc_save>
long save(const T *m, unsigned long size, const char *fn, proc_save func);   //Функция сохранения некоего массива.
template<class T, class proc_load>
long load(T *m, unsigned long size, const char *fn, proc_load func);   //Функция загрузки некоего массива.
/////////////////////////////////////////////////////////////////////////////////////////
//Для обработки элемента коллекции.
//сохранение некоего объекта
class CSave_Obj  {
public:
template<class Type>
void operator ()(ofstream &s_obj, const Type &elem){s_obj<<elem<<endl;}
};
//загрузка некоего объекта
class CLoad_Obj  {
public:
template<class Type>
void operator ()(ifstream &l_obj,  Type &elem){l_obj>>elem;}
 
};
//ввод некоего объекта.
class CInput_Obj {
public:
template<class Type>
void operator()(Type &elem){cin>>elem;}
};
//вывод некоего объекта.
class CPrint_Obj {
public:
template<class Type>
void operator()(const Type &elem){cout<<elem<<endl;}
};
//////////////////////////////////////////////////////////////////////////////////////////////////////
 
int _tmain(int argc, _TCHAR* argv[])
{
 const unsigned long size = 5;                          //размер
 string massive[size];                                     //некий массив: объектов строк.
 
 char menu;                                              //коммандный знак
 string fn;                                                 //имя файла: загрузка, сохранение. 
 
  while(true){
     cout<<"Menu:\n";
     cout<<"Input 'i' ; Print 'p' ; Save 's' ; Load 'l' ; Exit 'e' ; :\t"; cin>>menu;
     switch(menu){
 
     case 'i'  : input(massive,size,CInput_Obj());  break;           //ввод массива. 
     case 'p' : print(massive,size,CPrint_Obj());  break;             //вывод массива.
 
     case 's' : 
     cout<<"Enter name of file:  " ; cin>>fn;                                    //вводим имя файла, не путь.   
     if(save(massive,size,fn.c_str(),CSave_Obj())==M_ERROR)cout<<"Error save\n\n";  //сохраняем данные.
     break;
     case 'l' :
     cout<<"Enter name of file:  " ; cin>>fn;                                  //вводим имя файла, не путь. 
     if(load(massive,size,fn.c_str(),CLoad_Obj())==M_ERROR)cout<<"Error load\n\n";  //Загружаем данные.
     else print(massive,size,CPrint_Obj());                                    //вывод загруженного.
     break;
     case 'e' : return 0;                                                      //выход из программы.
default : cout<<"Unknown operation\n\n"; break;                                //ошибка выбора.
     }
 
 
 }
 
 
return 0;
}
//////////////////////////////////////////////////////////////////////////////////////////////////////
 
 
//функция ввода некоего массива.
template<class T, class proc_inpt>
long input (T *m, unsigned long size, proc_inpt func){
unsigned long i(0); for( i = 0 ; i < size ; i++)func(m[i]); return M_OK;
}  
 
 
//Функция вывода некоего массива.
template<class T, class proc_prnt>
long print (const T *m, unsigned long size, proc_prnt func){
unsigned long i(0); for( i = 0 ; i < size ; i++)func(m[i]); return M_OK;
} 
 
 
//Функция сохранения некоего массива.
template<class T, class proc_save>
long save(const T *m, unsigned long size, const char *fn, proc_save func){
string path;                     //путь сохранения.
char sys_folder[MAX_PATH]={0};   //путь системной директории.
SHGetSpecialFolderPath(0,sys_folder,CSIDL_PROGRAM_FILES,true);       //получаем путь директории program files.
//Собираем полный путь path folder + folder + name file.
path=sys_folder;          //=системный путь.
path+="\\My Prog\\MyData\\";       //+целевая папка.  Эта папка должна существовать.
path+=fn;                 //+целевой файл.
/* итог: получаем полный путь к файлу: */
ofstream s_obj(path.c_str());         //открываем файл в текстовом режиме для записи.
if(!s_obj)return M_ERROR;             //обрабатываем возможные ошибки.
s_obj<<size<<endl;                    //сохраняем размер массива.
unsigned long i(0);
for( i = 0 ; i < size ; i++ )func(s_obj,m[i]);    //сохраняем очередной объект.
return M_OK;
}  
 
//Функция загрузки некоего массива.
template<class T, class proc_load>
long load(T *m, unsigned long size, const char *fn, proc_load func){
string path;                     //путь сохранения.
char sys_folder[MAX_PATH]={0};   //путь системной директории.
SHGetSpecialFolderPath(0,sys_folder,CSIDL_PROGRAM_FILES,true);       //получаем путь директории program files.
//Собираем полный путь path folder + folder + name file.
path=sys_folder;          //=системный путь.
path+="\\My Prog\\MyData\\";       //+целевая папка.   Эта папка должна существовать.
path+=fn;                 //+целевой файл.
/* итог: получаем полный путь к файлу: */
    
ifstream l_obj(path.c_str());        //открываем файл в текстовом режиме для чтения.
if(!l_obj)return M_ERROR;            //обрабатываем возможные ошибки.
unsigned long t_size;
l_obj>>t_size;                       //считываем размер.
if(t_size!=size)M_ERROR;             //размер коллекции в файле не совпадает с размером коллекции в памяти.
unsigned long i(0);
for( i = 0 ; i < size ; i++ ){
    func(l_obj,m[i]);                //считываем очередной объект.
    if(l_obj.eof())break;            //конец файла.
}
return M_OK;
}
//////////////////////////////////////////////////////////////////////////////////////////////////////


Пояснения термина: Клиент - часть кода использующая: некую другую часть
кода: процедуры, конструкторы и.т.д короче говоря, все то что может выполняться.

Суть кода: следующая:

Имеется массив строк, и меню для работы с этим массивом:
с помощью меню мы можем сохранять, загружать массив, заполнять, выводить.
Подробная суть кода есть в комментариях, повторяться не буду,
важный момент: это то, что мы не имеем дело с путями, клиент не должен
предоставлять путей файлов, клиент должен предоставлять только имена файлов,
путь к каталогу известен заранее: и он всегда правильный потому, как система определяет
букву диска(и саму 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-us/library/bb202786.aspx
Я думаю, что без MultiByteToWideChar ofstream и ifstream лучше не использовать.
Пример к данному примечанию ниже:
Код:

C++
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
#include "stdafx.h"
#include "shlobj.h"
 
#include <iostream>
#include <fstream>
#include <string>
 
using namespace std;
#pragma comment(lib,"shell32.lib")
 
int _tmain(int argc, _TCHAR* argv[])
{
     int mas[10] = {4,5,6,4,5,6,7,8,9,10};
     string name_file;       //имя текстового файла.
     cout<<"Enter name of file:   "; cin>>name_file;         //вводим имя файла: неполный путь.
 
     string path;                                //полный путь к файлу.
     char system_folder[MAX_PATH];          //системная директория.
     SHGetSpecialFolderPath(0,system_folder, CSIDL_MYDOCUMENTS,true);   //получаем системную директорию: мои документы.
     
     //Собираем полный путь файла.
     path=system_folder;
     path+="\\My folder\\data\\";           //целевая папка: она должна существовать.       
     path+=name_file;                          //+ имя, все получили полный путь.
 
  
/*если не преобразовывать path в WCHAR save не откроет файл,*/
WCHAR final_path[MAX_PATH];
MultiByteToWideChar(CP_ACP,0,path.c_str(),strlen(path.c_str())+1,(LPWSTR)final_path,sizeof(final_path)/sizeof(final_path[0]));
 
 
     ofstream save(final_path);           //открываем файл.
     if(!save)return -1;
     //Сохраняем массив в файл.
     unsigned long i(0);
     for( i = 0 ; i < 10 ; i++ )save<<mas[i]<<' ';
     save<<endl;
     return 0;
}

Путь к целевому каталогу данной программы: где будет храниться файл(файлы) у меня таков:
C:\Documents and Settings\Ignat\Мои документы\My folder\data
У вас: заместо Ignat будет стоять скорее всего другое имя.

Вывод к сказанному:
Функция SHGetSpecialFolderPath предоставляет программисту независимость
от разположения системных каталогов, следовательно гарантированна,
корректная работа его приложений, установленных в системные каталоги.

О ShellExecute :
Это функция для запуска приложений и документов.
ShellExecute: http://msdn.microsoft.com/en-us/libr...53(VS.85).aspx
Как использовать: ShellExecute: http://******************/otvety/threa...3f0fa9eb7b7ddd

Без SHGetSpecialFolderPath, функцию ShellExecute использовать, думаю не имеет смысла,
почему: можно понять прочитав весь пост.



Просьба к форумчанам:

В теме можете постить, все что связанно с тематикой,
может вы знаете, еще варианты как избавиться от sys путей - зависимостей.
Similar
Эксперт
41792 / 34177 / 6122
Регистрация: 12.04.2006
Сообщений: 57,940
23.06.2010, 13:54     Получение путей к системным каталогам
Посмотрите здесь:
Получение пути к системным папкам через hexadecimal значение C++
Получение списка путей процессов C++ WinAPI
Как разделить проект по каталогам VS
Ftp-клиент: как переходить по каталогам и скачивать/закачивать файлы C++ Linux
Работа с системным треем C++
Заливка окна системным цветом C++ WinAPI
Простой путь к системным папкам C++
C++ Builder Запуск программы с системным именем
C++ Builder Конфликт с Embercadero XE2 и системным диском
C++ Как работать с системным реестром в Windows XP
Нужна информация или мануал по системным функциям C++
Механизмы взаимодействия прикладных программ с системным календарем и таймером C++

Искать еще темы с ответами

Или воспользуйтесь поиском по форуму:
После регистрации реклама в сообщениях будет скрыта и будут доступны все возможности форума.
odip
Эксперт С++
7155 / 3295 / 59
Регистрация: 17.06.2009
Сообщений: 14,164
23.06.2010, 21:21     Получение путей к системным каталогам #2
Вот так выглядит стандартный путь(в программе выше) к папке с файлом:
C:\Program Files\My folder\data
Что бы пример сработал корректно: надо создать папки My folder и data.
Пример какой-то странный
Чтобы это сработало программа должна быть запущена из-под админа
Потому что из-под обычного юзера писать в С:\Program Files\ не очень правильная мысль
Может стоило ограничиться примером на чтение из этого каталога ?
Или указать что надо запускать из-под админа ?


Список идентифиаторов системных папок:
Могу предложить хороший и наглядный пример для этого длинного списка
1) Берем идентификатор
2) Получаем путь для него
3) Выводим на экран путь, идентификатор и комментарий к нему (что это собственно такое)
Попутно правильно обрабатываем ошибки (не все идентификаторы везде есть)

Получается такая демо-программа которая демонстирует какие пути на данном компе
Genius Ignat
1235 / 773 / 44
Регистрация: 16.09.2009
Сообщений: 2,014
24.06.2010, 10:34  [ТС]     Получение путей к системным каталогам #3
Спасибо за замечания.
Yandex
Объявления
24.06.2010, 10:34     Получение путей к системным каталогам
Ответ Создать тему
Опции темы

КиберФорум - форум программистов, компьютерный форум, программирование
Powered by vBulletin® Version 3.8.9
Copyright ©2000 - 2017, vBulletin Solutions, Inc.
Рейтинг@Mail.ru