Глобальный путь к папке пользователя в Windows

Вопросы программирования на Free Pascal, использования компилятора и утилит.

Модератор: Модераторы

KUKA
новенький
Сообщения: 46
Зарегистрирован: 22.02.2012 20:54:19

Глобальный путь к папке пользователя в Windows

Сообщение KUKA »

Добрый день.
Возникла проблема, нужно записывать файл параметров в папку в "Мои документы". Как нужно указать путь к папке пользователя у которого будет приложение?

Есть же вариант получить у винды имя пользователя а потом просто его вставить в путь к папке.
Padre_Mortius
энтузиаст
Сообщения: 1265
Зарегистрирован: 29.05.2007 17:38:07
Откуда: Спб

Сообщение Padre_Mortius »

посмотреть в реестре в ветке HKCU\Environment
Аватара пользователя
B4rr4cuda
энтузиаст
Сообщения: 693
Зарегистрирован: 28.12.2007 06:48:35

Сообщение B4rr4cuda »

Курить док по апишной функции GetSpecialFolderPath и CSIDL_MYDOCUMENTS.
KUKA
новенький
Сообщения: 46
Зарегистрирован: 22.02.2012 20:54:19

Сообщение KUKA »

B4rr4cuda писал(а):Курить док по апишной функции GetSpecialFolderPath и CSIDL_MYDOCUMENTS.

Нашел, спасибо :)
svk12
постоялец
Сообщения: 411
Зарегистрирован: 09.06.2008 18:42:47

Сообщение svk12 »

GetEnvironmentVariable('USERPROFILE')
или
GetEnvironmentVariable('HOMEPATH')
Последний раз редактировалось svk12 23.02.2012 15:49:31, всего редактировалось 1 раз.
KUKA
новенький
Сообщения: 46
Зарегистрирован: 22.02.2012 20:54:19

Сообщение KUKA »

Че-то не очень получается, например мне нужен был CSIDL_MYDOCUMENTS
После вывода на экран выводит такую крякозябру:
http://gyazo.com/adc45bdc1491f0a6e1a5e4ed720a2da1

Сам код:

Код: Выделить всё

function GetSpecialPath(CSIDL: word): string;
var s: array[0..255] of Char;
begin
s[0]:=#0;
SHGetSpecialFolderPath(0, s, CSIDL, true);
for i:=0 to 255 do
GetSpecialPath:=getspecialpath+s[i];
end;
Аватара пользователя
B4rr4cuda
энтузиаст
Сообщения: 693
Зарегистрирован: 28.12.2007 06:48:35

Сообщение B4rr4cuda »

Код: Выделить всё

uses windows, shfolder;
..
function GetSpecialFolderPath(Folder : integer) : string;
const
  SHGFP_TYPE_CURRENT = 0;
var
  path: array [0..MAX_PATH] of char;
begin
  if SUCCEEDED(SHGetFolderPath(0,Folder,0,SHGFP_TYPE_CURRENT,@path[0])) then
    Result := path
  else
    Result := '';
end;//GetSpecialFolderPath

procedure TForm1.Button1Click(Sender: TObject);
begin
  showmessage(GetSpecialFolderPath(CSIDL_PERSONAL));
end;
SAK
постоялец
Сообщения: 158
Зарегистрирован: 17.02.2006 23:45:14
Откуда: Тим
Контактная информация:

Сообщение SAK »

KUKA писал(а):нужно записывать файл параметров в папку в "Мои документы"

Если это именно файл параметров, а не документ, то зачем его в "Мои документы" писать? Есть же %APPDATA%

Код: Выделить всё

ShowMessage(sysutils.GetEnvironmentVariable('APPDATA'));

А то очень часто раздражает всякий мусор среди документов.
Последний раз редактировалось SAK 03.03.2012 18:42:50, всего редактировалось 1 раз.
v-t-l
энтузиаст
Сообщения: 744
Зарегистрирован: 13.05.2007 16:27:22
Откуда: Belarus

Сообщение v-t-l »

Код: Выделить всё

unit FileUtil;
...
function GetAppConfigDirUTF8(Global: Boolean): string;
function GetAppConfigFileUTF8(Global: Boolean; SubDir: boolean = false): string;
...
Аватара пользователя
stikriz
энтузиаст
Сообщения: 612
Зарегистрирован: 15.03.2006 08:37:47

Сообщение stikriz »

KUKA писал(а):Возникла проблема, нужно записывать файл параметров в папку в "Мои документы". Как нужно указать путь к папке пользователя у которого будет приложение?

Предлагаю писать в папку ProgramData. Во первых, настройки будут видны всем пользователям, всем сеансам, во вторых, в МоихДокументах и так всякой дряни много.

uses ... shlobj, ...

var Tmp: array[0..MAX_PATH - 1] of Char;
...
if SHGetSpecialFolderPath(0,Tmp, CSIDL_COMMON_APPDATA, false) then
В Tmp папка куда нужно писать настройки программы.

А если вызвать с CSIDL_APPDATA, то там хранить настройки программы, которые важны именно конкретному пользователю.
Аватара пользователя
Sergei I. Gorelkin
энтузиаст
Сообщения: 1409
Зарегистрирован: 24.07.2005 14:40:41
Откуда: Зеленоград

Сообщение Sergei I. Gorelkin »

С CSIDL_COMMON_APPDATA есть засада: при настройках винды по умолчанию файлы, созданные одним пользователем, для всех остальных доступны только для чтения (хотя создавать там файлы могут все).
Аватара пользователя
alexs
долгожитель
Сообщения: 4069
Зарегистрирован: 15.05.2005 23:17:07
Откуда: г.Ставрополь
Контактная информация:

Сообщение alexs »

А почему не используется метод предложенный v-t-l? Это наиболее правильный вариант. И кросплатформенный.
Аватара пользователя
stikriz
энтузиаст
Сообщения: 612
Зарегистрирован: 15.03.2006 08:37:47

Сообщение stikriz »

alexs писал(а):А почему не используется метод предложенный v-t-l?

Потому, что хелпа нету, и вообще доки никакой. Песнями о паскале тут не обойтись :-) (прошу прощение за такую аллегорию - книжка хорошая) Нужен хелп как в дельфи до седьмой версии - на чем угодно F1 - и смотри, да еще с примерчиком.
Аватара пользователя
alexs
долгожитель
Сообщения: 4069
Зарегистрирован: 15.05.2005 23:17:07
Откуда: г.Ставрополь
Контактная информация:

Сообщение alexs »

stikriz писал(а):Потому, что хелпа нету, и вообще доки никакой


А посмотреть, как эти функции реализованы?
Почему страшно заглянуть в исходник? Там всё просто и понятно.
Аватара пользователя
stikriz
энтузиаст
Сообщения: 612
Зарегистрирован: 15.03.2006 08:37:47

Сообщение stikriz »

Все функции смотреть? С этими разобрались. А с остальными? :-)

Добавлено спустя 2 минуты 13 секунд:
Кстати, очень неудобно, что, например, в виндовозном инсталяторе лазаруса нет текстов для линукса. Не всегда даже понятно, что функция кросплатформенная. И еще, интересно было бы видеть как там и как здесь что-то реализуется.
Ответить