Модераторы: Poseidon, Snowy, bems, MetalFan
  

Поиск:

Ответ в темуСоздание новой темы Создание опроса
> Конвертировать FileName в переменные среды 
:(
    Опции темы
Чучмек
Дата 5.7.2012, 13:45 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


НЭТ БИЛЭТ
**


Профиль
Группа: Участник
Сообщений: 841
Регистрация: 11.5.2008
Где: СССР

Репутация: 14
Всего: 41



Есть ли функция, которая преобразует строки типа C:\Program Files\My\My.file в %ProgramFiles%\My\My.file ?
И наоборот?
Неохота городить огород. 


--------------------
умную мысль держи при себе, а дурной - поделись с другими 
PM MAIL   Вверх
Ne1tr1n0
Дата 5.7.2012, 22:04 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Шустрый
*


Профиль
Группа: Участник
Сообщений: 120
Регистрация: 1.3.2009

Репутация: 6
Всего: 8



Надо что-то обратное ExpandEnvironmentStrings?
Если да, то это наверное подойдет: PathUnExpandEnvStrings
PM MAIL   Вверх
Чучмек
Дата 5.7.2012, 22:33 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


НЭТ БИЛЭТ
**


Профиль
Группа: Участник
Сообщений: 841
Регистрация: 11.5.2008
Где: СССР

Репутация: 14
Всего: 41



За первую функцию спасибо.
Вторая, к сожалению, работает не так, как хотелось.
Вместо %temp%\3.tmp возвращает %USERPROFILE%\Local Settings\Temp\3.tmp


--------------------
умную мысль держи при себе, а дурной - поделись с другими 
PM MAIL   Вверх
Ne1tr1n0
Дата 5.7.2012, 23:18 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Шустрый
*


Профиль
Группа: Участник
Сообщений: 120
Регистрация: 1.3.2009

Репутация: 6
Всего: 8



к сожалению да, она только некоторые переменные среды парсит и заменяет значение в строке на имя переменной (всего 7 значений, перечислены в статье по ссылке).
Почему только эти, и не берет остальные непонятно.
Видимо придется все-таки городить велосипед.
По идее можно с помощью GetEnvironmentVariables получить все переменные среды для процесса и самому распарсить результат, проверить его на предмет наличия в исходной строке. В результат вывести строку, в которой наибольший путь (по длине или же по кол-ву оставшихся слешей) заменен переменной.
PM MAIL   Вверх
Чучмек
Дата 5.7.2012, 23:30 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


НЭТ БИЛЭТ
**


Профиль
Группа: Участник
Сообщений: 841
Регистрация: 11.5.2008
Где: СССР

Репутация: 14
Всего: 41



Да я примерно так и делаю, через GetEnvironmentStrings.
Выбираю те, которые X:\... , сортирую по длине, и ищу вхождение. 


--------------------
умную мысль держи при себе, а дурной - поделись с другими 
PM MAIL   Вверх
Ne1tr1n0
Дата 5.7.2012, 23:54 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Шустрый
*


Профиль
Группа: Участник
Сообщений: 120
Регистрация: 1.3.2009

Репутация: 6
Всего: 8



Вот набросал тут примерный вариант функции. Вроде работает. Возможно конечно придется внести какие-то дополнительные проверки, на регистр может быть или ещё на что-нить, да и мог накосячить (время-то позднее):
Код

function PathUnExpandEnvStrings(Path: string): string;
var i: integer;
    EnvStrings: PChar;
    EnvList: TStringList;
    VarParser: TStringList;
    MinLength: integer;
    EnvStringsMaxSize: Integer;
    s: string;
begin
  EnvList:=TStringList.Create;
  EnvStringsMaxSize:= 10000;
  EnvStrings:= GetEnvironmentStrings;
  try
    i:=0;
    s:='';
    while i < EnvStringsMaxSize do
    begin
      if EnvStrings[i]<>#0 then
      s:=s + EnvStrings[i]
      else
      begin
        if s='' then
        Break;
        EnvList.Add(s);
        s:='';
      end;
    Inc(i);
    end;
  finally
    FreeEnvironmentStrings(EnvStrings);
  end;

  MinLength:=Length(Path);
  for i := 0 to EnvList.Count - 1 do
  begin
    VarParser:=TStringList.Create;
    VarParser.Delimiter:='=';
    VarParser.DelimitedText:=StringReplace(EnvList[i], ' ', '#', [rfReplaceAll]);
    VarParser[1]:=StringReplace(VarParser[1], '#', ' ', [rfReplaceAll]);
    if Pos(VarParser[1], Path) <> 0 then
    begin
      if Length(Path) - Length(VarParser[1]) < MinLength then
      begin
        MinLength:=Length(Path) - Length(VarParser[1]);
        result:=StringReplace(Path, VarParser[1], '%' + VarParser[0] + '%', []);
      end;
    end;
    VarParser.Free;
  end;
  EnvList.Free;
end;

PM MAIL   Вверх
northener
Дата 6.7.2012, 01:06 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Эксперт
***


Профиль
Группа: Завсегдатай
Сообщений: 1361
Регистрация: 2.9.2010

Репутация: 8
Всего: 20



Цитата(Чучмек @  5.7.2012,  22:33 Найти цитируемый пост)
Вторая, к сожалению, работает не так, как хотелось.
Вместо %temp%\3.tmp возвращает %USERPROFILE%\Local Settings\Temp\3.tmp

А чем не устраивает? 
Какая задача? Может огород городишь не на том участке поля? smile


--------------------
Но только лошади летают вдохновенно.
Иначе лошади разбились бы мгновенно!
PM MAIL   Вверх
  
Ответ в темуСоздание новой темы Создание опроса
Правила форума "Delphi: Общие вопросы"
SnowyMetalFan
bemsPoseidon
Rrader

Запрещается!

1. Публиковать ссылки на вскрытые компоненты

2. Обсуждать взлом компонентов и делиться вскрытыми компонентами

  • Литературу по Дельфи обсуждаем здесь
  • Действия модераторов можно обсудить здесь
  • С просьбами о написании курсовой, реферата и т.п. обращаться сюда
  • Вопросы по реализации алгоритмов рассматриваются здесь
  • 90% ответов на свои вопросы можно найти в DRKB (Delphi Russian Knowledge Base) - крупнейшем в рунете сборнике материалов по Дельфи


Если Вам понравилась атмосфера форума, заходите к нам чаще! С уважением, Snowy, MetalFan, bems, Poseidon, Rrader.

 
0 Пользователей читают эту тему (0 Гостей и 0 Скрытых Пользователей)
0 Пользователей:
« Предыдущая тема | Delphi: Общие вопросы | Следующая тема »


 




[ Время генерации скрипта: 0.0451 ]   [ Использовано запросов: 22 ]   [ GZIP включён ]


Реклама на сайте     Информационное спонсорство

 
По вопросам размещения рекламы пишите на vladimir(sobaka)vingrad.ru
Отказ от ответственности     Powered by Invision Power Board(R) 1.3 © 2003  IPS, Inc.