Форум программистов, компьютерный форум, киберфорум
Delphi для начинающих
Войти
Регистрация
Восстановить пароль
Карта форума Темы раздела Блоги Сообщество Поиск Заказать работу  
 
 
Рейтинг 4.95/40: Рейтинг темы: голосов - 40, средняя оценка - 4.95
30 / 26 / 8
Регистрация: 17.09.2015
Сообщений: 498
Записей в блоге: 6
1

Переменные среды Windows

05.10.2017, 00:25. Показов 7270. Ответов 20
Метки нет (Все метки)

Author24 — интернет-сервис помощи студентам
Приветствую Уважаемые форумчане!

Есть у меня функция для извлечения
из переменной полного пути.

Delphi
1
2
3
4
5
6
7
8
function GetAbsPath(const s: string): string;
var
  ln:  Cardinal;
begin
  ln := ExpandEnvironmentStrings(PChar(s),nil,0);
  SetLength(Result, ln);
  ExpandEnvironmentStrings(PChar(s), PChar(result), ln);
end;
Использование:

C:\Users\Igor\AppData\Roaming = GetAbsPath('%AppData%');

Собственно вопрос, на сколько правильное решение и правильное ли оно вообще, для определения указанной директории
>>> C:\Users\Igor\AppData\Roaming <<<

И есть ли вероятность что какая нибудь из OS семейства Windows вернет C:\Users\Igor\AppData\Roaming\ а не C:\Users\Igor\AppData\Roaming

Или вообще не чего не вернет ((( как добиться максимальной совместимости?

Дайте пожалуйста ответ, как бы вопрос глупо не звучал.
0
Programming
Эксперт
94731 / 64177 / 26122
Регистрация: 12.04.2006
Сообщений: 116,782
05.10.2017, 00:25
Ответы с готовыми решениями:

Переменные Среды (Использование готового кода)
Накопал на сайте Код для получения переменных сред. procedure GetEnvironmentStrings(ss:TStrings);...

Переменные среды Windows
Доброго времени всем! Так и не врубился, как заставить код понимать переменные среды Windows...

Переменные среды windows
Я только начинаю изучать, для меня все очень сложно. Есть такой код #include &lt;iostream&gt; #include...

Переменные среды Windows
Как в c++ использовать переменные среды windows? Например я хочу открыть текстовый файл в...

20
пофигист широкого профиля
4732 / 3167 / 858
Регистрация: 15.07.2013
Сообщений: 18,252
05.10.2017, 01:48 2
А для чего вообще вам это нужно? Ну т.е. я имею в виду "переменные среды".
0
30 / 26 / 8
Регистрация: 17.09.2015
Сообщений: 498
Записей в блоге: 6
05.10.2017, 01:57  [ТС] 3
Цитата Сообщение от northener Посмотреть сообщение
А для чего вообще вам это нужно? Ну т.е. я имею в виду "переменные среды".
Мне нужна директория C:\Users\Igor\AppData\Roaming
Работать программа будет на разных компьютерах

C:\Users\Igor\AppData\Roaming
C:\Users\Vasy\AppData\Roaming
C:\Users\Pety\AppData\Roaming
C:\Users\Алёша\AppData\Roaming

Для этого...

А там что я буду делать в этой директории...

Добавлено через 3 минуты
Есть еще функция

Delphi
1
2
3
4
5
6
7
8
9
10
11
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;
По константе, но по константе не удобно.
Так как мне хотелось бы передавать в качестве аргумента не константу, а для примера %AppData%\Temp\Хрень\

в итоге должно получится C:\Users\Алёша\AppData\Roaming\Temp\Хрень\

Добавлено через 2 минуты
Чем больше я погружаюсь в мир программирования для Windows тем больше вопросов бле**** . о_О
Всякие не стыковки... У меня все работает, у заказчика нет че за хрень...
0
пофигист широкого профиля
4732 / 3167 / 858
Регистрация: 15.07.2013
Сообщений: 18,252
05.10.2017, 01:59 4
Цитата Сообщение от popryduhin Посмотреть сообщение
Мне нужна директория C:\Users\Igor\AppData\Roaming
Может вам нужен CSIDL_LOCAL_APPDATA ?
0
30 / 26 / 8
Регистрация: 17.09.2015
Сообщений: 498
Записей в блоге: 6
05.10.2017, 02:04  [ТС] 5
Ну у меня констант много, смотрите

Delphi
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
CSIDL_PERSONAL = $0005; { My Documents }
{$EXTERNALSYM CSIDL_PERSONAL}
  CSIDL_APPDATA = $001A; { Application Data, new for NT4 }
{$EXTERNALSYM CSIDL_APPDATA}
  CSIDL_LOCAL_APPDATA = $001C; { non roaming, user\Local Settings\Application Data }
{$EXTERNALSYM CSIDL_LOCAL_APPDATA}
  CSIDL_MYMUSIC = $000d;
{$EXTERNALSYM CSIDL_MYMUSIC}
  CSIDL_MYVIDEO                 = $000e;          // "My Videos" folder
{$EXTERNALSYM CSIDL_MYVIDEO}
  CSIDL_INTERNET_CACHE = $0020;
{$EXTERNALSYM CSIDL_INTERNET_CACHE}
  CSIDL_COOKIES = $0021;
{$EXTERNALSYM CSIDL_COOKIES}
  CSIDL_HISTORY = $0022;
{$EXTERNALSYM CSIDL_HISTORY}
  CSIDL_COMMON_APPDATA = $0023; { All Users\Application Data }
{$EXTERNALSYM CSIDL_COMMON_APPDATA}
  CSIDL_WINDOWS = $0024; { GetWindowsDirectory() }
{$EXTERNALSYM CSIDL_WINDOWS}
  CSIDL_SYSTEM = $0025; { GetSystemDirectory() }
{$EXTERNALSYM CSIDL_SYSTEM}
  CSIDL_PROGRAM_FILES = $0026; { C:\Program Files }
{$EXTERNALSYM CSIDL_PROGRAM_FILES}
  CSIDL_MYPICTURES = $0027; { My Pictures, new for Win2K }
{$EXTERNALSYM CSIDL_MYPICTURES}
  CSIDL_PROGRAM_FILES_COMMON = $002b; { C:\Program Files\Common }
{$EXTERNALSYM CSIDL_PROGRAM_FILES_COMMON}
  CSIDL_COMMON_DOCUMENTS = $002e; { All Users\Documents }
{$EXTERNALSYM CSIDL_COMMON_DOCUMENTS}
  CSIDL_COMMON_MUSIC            = $0035;          // All Users\My Music
{$EXTERNALSYM CSIDL_COMMON_MUSIC}
  CSIDL_COMMON_PICTURES         = $0036;          // All Users\My Pictures
{$EXTERNALSYM CSIDL_COMMON_PICTURES}
  CSIDL_COMMON_VIDEO            = $0037;          // All Users\My Video
{$EXTERNALSYM CSIDL_COMMON_VIDEO}
Но, мне нужно передавать в качестве аргумента %AppData%\Temp\Хрень\

Добавлено через 2 минуты
я же не передам вот так

CSIDL_APPDATA+\Temp\Хрень\

Конечно можно написать свой костыль.
Что то типа

Delphi
1
2
3
4
5
6
7
8
9
10
11
12
13
14
function GetSpecialFolderPath(folder: integer): string;
const
  SHGFP_TYPE_CURRENT = 0;
var
  path: array [0 .. MAX_PATH] of char;
begin
 
 if folder = %AppData% then
  if SUCCEEDED(SHGetFolderPath(0, CSIDL_APPDATA , 0, SHGFP_TYPE_CURRENT, @path[0])) then
    Result := path
  else
    Result := '';
 
end;
Добавлено через 49 секунд
Ну это как в командной строке echo %AppData%
0
пофигист широкого профиля
4732 / 3167 / 858
Регистрация: 15.07.2013
Сообщений: 18,252
05.10.2017, 02:11 6
Цитата Сообщение от popryduhin Посмотреть сообщение
Но, мне нужно передавать в качестве аргумента %AppData%\Temp\Хрень\
Попробуйте обосновать зачем вам именно так нужно?
А я свой предыдущий ответ поместил после прочтения вашего
Цитата Сообщение от popryduhin Посмотреть сообщение
Или вообще не чего не вернет ((( как добиться максимальной совместимости?
Переменные среды это рудименты эпохи MS DOS. Пока они вроде поддерживаются (не проверял на версиях ОС выше W7). Но если мелкомягкие всё-таки решатся плюнуть на совместимость, то переменные среды, имхо, будут первой жертвой.
0
30 / 26 / 8
Регистрация: 17.09.2015
Сообщений: 498
Записей в блоге: 6
05.10.2017, 02:17  [ТС] 7
Цитата Сообщение от northener Посмотреть сообщение
Попробуйте обосновать зачем вам именно так нужно?
А я свой предыдущий ответ поместил после прочтения вашего

%AppData%\Temp\Хрень\
Когда я буду в своей программе составлять некий скрипт, что бы не писать полный относительный путь я буду использовать переменные среды. Я же не телепат что бы узнать какое имя у пользователя (хотя есть некие телепатические способности, можно так же средствами Delphi определить имя пользователя а потом вставить куда нужно, но зачем?)

Хочу ограничится %AppData%. Ну если переменные среды совместимы со всеми версиями ОС то это ЗБС.
0
пофигист широкого профиля
4732 / 3167 / 858
Регистрация: 15.07.2013
Сообщений: 18,252
05.10.2017, 02:29 8
Цитата Сообщение от popryduhin Посмотреть сообщение
Я же не телепат что бы узнать какое имя у пользователя
А зачем вам его знать? ShGetSpeсialFolderPath с параметром CSIDL_LOCAL_APPDATA вернёт вам именно тот путь, который вам нужен. Во всяком случае это не столь древний метод получения пути к стандартным папкам.
Но в любом случае решение за вами. И в случае неудачи, голову отрубят вам
0
30 / 26 / 8
Регистрация: 17.09.2015
Сообщений: 498
Записей в блоге: 6
05.10.2017, 02:31  [ТС] 9
А у вас какая ОС?
Вы можете выполнить в консоли echo %AppData% ???
0
пофигист широкого профиля
4732 / 3167 / 858
Регистрация: 15.07.2013
Сообщений: 18,252
05.10.2017, 02:41 10
Цитата Сообщение от popryduhin Посмотреть сообщение
А у вас какая ОС?
Вы можете выполнить в консоли echo %AppData% ???
А какая версия ОС вас интересует?
Я могу (благодаря VMware) попробовать "выполнить в консоли echo %AppData%" в W98, WXP, W7 и W10.
0
30 / 26 / 8
Регистрация: 17.09.2015
Сообщений: 498
Записей в блоге: 6
05.10.2017, 02:43  [ТС] 11
У меня Win 7 x64

Я думаю что не стоит так заморачиваться, но если не сложно, да бы пролить свет...

желаемые ос это все что выше семерки.
0
пофигист широкого профиля
4732 / 3167 / 858
Регистрация: 15.07.2013
Сообщений: 18,252
05.10.2017, 03:00 12
Проверил. На W10 работает, о чём я и говорил ранее.
1
30 / 26 / 8
Регистрация: 17.09.2015
Сообщений: 498
Записей в блоге: 6
05.10.2017, 03:10  [ТС] 13
Цитата Сообщение от northener Посмотреть сообщение
Проверил. На W10 работает, о чём я и говорил ранее.
Следовательно не париться, все будет работать...

Добавлено через 12 секунд
Спасибо!!!
0
пофигист широкого профиля
4732 / 3167 / 858
Регистрация: 15.07.2013
Сообщений: 18,252
05.10.2017, 03:18 14
Цитата Сообщение от popryduhin Посмотреть сообщение
Следовательно не париться, все будет работать...
Не совсем так
Пока не париться. Пока работает. Но жди подвоха каждый год.
0
Житель Земли
3002 / 3004 / 391
Регистрация: 26.07.2011
Сообщений: 11,463
Записей в блоге: 1
06.10.2017, 09:41 15
Цитата Сообщение от popryduhin Посмотреть сообщение
вероятность что какая нибудь из OS семейства Windows вернет C:\Users\Igor\AppData\Roaming\ а не C:\Users\Igor\AppData\Roaming
IncludeTrailingPathDelimiter - проверяет и добавляет слэш-разделитель в конец, если его нет
ExcludeTrailingPathDelimiter - проверяет и удаляет слэш-разделитель в конце, если он есть

Добавлено через 46 секунд
с другой стороны, можно и самому подумать и написать функцию проверки в две строки
0
30 / 26 / 8
Регистрация: 17.09.2015
Сообщений: 498
Записей в блоге: 6
06.10.2017, 11:16  [ТС] 16
Цитата Сообщение от DenNik Посмотреть сообщение
IncludeTrailingPathDelimiter - проверяет и добавляет слэш-разделитель в конец, если его нет
ExcludeTrailingPathDelimiter - проверяет и удаляет слэш-разделитель в конце, если он есть
Добавлено через 46 секунд
с другой стороны, можно и самому подумать и написать функцию проверки в две строки
А я всегда вот такой костыль подставлял
Delphi
1
2
DestDir := ExtractFilePath(ParamStr(0))+'\';
DestDir := DestDir.Replace('\\','\', [rfReplaceAll]);
0
Житель Земли
3002 / 3004 / 391
Регистрация: 26.07.2011
Сообщений: 11,463
Записей в блоге: 1
06.10.2017, 11:27 17
Цитата Сообщение от popryduhin Посмотреть сообщение
А я всегда вот такой костыль подставлял
жестяк! зачем добавлять символ, чтобы тут же его убрать?

ExtractFilePath ВСЕГДА возвращает путь с разделителем в конце, а разделителем может быть и не слэш (зависит от настроек ОС). в этом плане и IncludeTrailingPathDelimiter оперирует с системным разделителем
0
30 / 26 / 8
Регистрация: 17.09.2015
Сообщений: 498
Записей в блоге: 6
06.10.2017, 11:39  [ТС] 18
Цитата Сообщение от DenNik Посмотреть сообщение
жестяк! зачем добавлять символ, чтобы тут же его убрать?
ExtractFilePath ВСЕГДА возвращает путь с разделителем в конце, а разделителем может быть и не слэш (зависит от настроек ОС). в этом плане и IncludeTrailingPathDelimiter оперирует с системным разделителем
Для примера )))

Добавлено через 2 минуты
Цитата Сообщение от popryduhin Посмотреть сообщение
а разделителем может быть и не слэш (зависит от настроек ОС)
да ладно??? Теоретически это так, но должно быть какое то соглашение, не верю в ерунду, где бы я ни был, везде видел разделитель \

Вы с какой планеты?
И какие разделители Вы видели?


Добавлено через 1 минуту
Да, и скажите еще что Email адрес, что бы отделить домен от имени адреса у Вас используют # )))

Добавлено через 5 минут
Да, к стати, идея.
Илон Маск колонизирует марс, вот там можно использовать альтернативы, \ заменить на |, а @ на #
0
Модератор
9256 / 6034 / 2379
Регистрация: 21.01.2014
Сообщений: 25,795
Записей в блоге: 3
06.10.2017, 11:52 19
Цитата Сообщение от popryduhin Посмотреть сообщение
где бы я ни был, везде видел разделитель \
А я видел разделитель / - сплошь и рядом в Unix
0
Житель Земли
3002 / 3004 / 391
Регистрация: 26.07.2011
Сообщений: 11,463
Записей в блоге: 1
06.10.2017, 11:58 20
Цитата Сообщение от popryduhin Посмотреть сообщение
везде видел разделитель \
возможно, я спутал с другим каким-то разделителем, не отрицаю, но..
1. если есть предопределенные функции, реализующие необходимый функционал, то
2. нахрена создавать даже не костыли, а обрубки костылей, добавляя, а затем убирая один и тот же символ?!

Добавлено через 54 секунды
Цитата Сообщение от D1973 Посмотреть сообщение
разделитель / - сплошь и рядом в Unix
вот именно, если кроссплатформенное приложение, то весь твой костыль, popryduhin, сломается с веселым треском

Добавлено через 1 минуту
а в исходниках делфи указано
Delphi
1
2
const
  PathDelim  = {$IFDEF MSWINDOWS} '\'; {$ELSE} '/'; {$ENDIF}
и дельфийские функции работают именно с этой константой

Добавлено через 3 минуты

Не по теме:

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

Delphi
1
2
{$IFDEF MSWINDOWS} '\'; {$ELSE} '/'; {$ENDIF}
str = 'Hello';
Pascal
1
2
{$IFDEF MSWINDOWS} '\'; {$ELSE} '/'; {$ENDIF}
str = 'Hello';

0
06.10.2017, 11:58
IT_Exp
Эксперт
87844 / 49110 / 22898
Регистрация: 17.06.2006
Сообщений: 92,604
06.10.2017, 11:58
Помогаю со студенческими работами здесь

Переменные окружения (среды) Windows XP
Нужно на большом количестве компьютеров изменить переменное окружение - добавить довольно много...

Переменные среды Windows в строке, считанной из файла
Задача: есть текстовый файл, в котором записаны пути к файлам или папкам. Требуется, например,...

Переменные среды
Например, я скачал и разархивировал JDK. Как сделать так, чтобы он был виден системе, т. е. если я...

Переменные среды - II
Ребята, вот что у меня получилось. Работает. ...

Переменные среды
Привет ! Вот записал в переменные среды такую штуку : RESIN_HOME=@#$. Хочу ее прочитать в...

Переменные среды
У меня такая же проблема, как у автора. Тоже проверял на подлинность. Потом перестал работать офис....


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

Или воспользуйтесь поиском по форуму:
20
Ответ Создать тему
КиберФорум - форум программистов, компьютерный форум, программирование
Powered by vBulletin
Copyright ©2000 - 2024, CyberForum.ru