Нахождение путей к файлам Total Commander

Материал из TCKB 2.0
Перейти к:навигация, поиск


© Copyright
Эта статья защищена авторским правом, и на её правку наложены ограничения.

Введение

К написанию данной мини-статьи меня побудило большое количество неточностей в аналогичной статье автора "SAM" (от 2005 года) - при проверке статьи в ней пришлось сделать аж 5 (пять!) врезок с поправками, и то статья осталась неполной. Для авторов, уже написавших утилиты с поиском файлов TC, той статьи, конечно, может и хватить, но для "полноты картины" следует все же описать все заново и последовательно.

Итак, у нас есть три различных "переменных", связанных с Total Commander, которые могут понадобиться:

  • Путь к каталогу TC (в том случае, когда нам нужно имя приложения TC, следует просто прибавить к пути каталога строку \Totalcmd.exe). [1]
  • Путь к основному файлу конфигурации (по умолчанию его имя - wincmd.ini).
  • Путь к файлу настроек FTP-соединений (по умолчанию его имя - wcx_ftp.ini).

Ниже - пошаговые алгоритмы нахождения этих путей нашей программой.

Алгоритм поиска каталога Total Commander

1. Смотрим значение переменной окружения %COMMANDER_PATH%. Если эта переменная задана, то это и есть путь к каталогу TC. Иначе - следующий шаг.

При запуске нашей программы из-под TC новых версий (6.00 и новее) переменная будет обязательно задана, так что, если мы укажем пользователю, что программа должна ОБЯЗАТЕЛЬНО вызываться из-под TC, одного этого пункта алгоритма хватит.

2. Смотрим значение ключа реестра

HKEY_CURRENT_USER\Software\Ghisler\Total Commander\InstallDir

Если это значение непусто, берем его. Иначе:

3. Смотрим значение ключа реестра

HKEY_LOCAL_MACHINE\Software\Ghisler\Total Commander\InstallDir

Если мы нашли путь к каталогу TC, следует проверить "правильность" этого каталога:

  • проверить существование в этом каталоге файла "Totalcmd.exe"
  • дополнительно НЕОБЯЗАТЕЛЬНО проверить то, что в структуре VersionInfo файла "Totalcmd.exe" поле InternalName имеет значение TOTALCMD.

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

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

Алгоритм поиска основного файла настроек

1. Смотрим значение переменной окружения %COMMANDER_INI%. Если эта переменная задана, то это и есть путь к файлу настроек. Иначе - следующий шаг.

При запуске нашей программы из-под TC новых версий (6.55 и новее) переменная будет обязательно задана.

2. Пункт алгоритма НЕОБЯЗАТЕЛЬНЫЙ (и, я бы даже сказал, экзотический): получение пути к файлу настроек из командной строки запущенного в данный момент процесса Total Commander.

Способ этот настолько "нестандартный", что мне известна всего одна программа, использующая его - это ReloadTC. [2]

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

3. Пункт алгоритма НЕОБЯЗАТЕЛЬНЫЙ. Если путь к каталогу TC был успешно найден, следует также поддерживать такую возможность Total Commander, как задание путей ключем "UseIniInProgramDir" (в версии 6.50 и новее).

Цитата
Кроме того, если файл wincmd.ini находится в каталоге Total Commander, то в нём можно указать ключ UseIniInProgramDir, задающий местоположение обоих ini-файлов.
Русская справка по Total Commander


Так что, если в найденном нами каталоге TC существует файл "wincmd.ini", читаем ключ из него и согласно справке (есть несколько значений ключа) определяем место ini-файла. [3]

4. Смотрим значение ключа реестра

HKEY_CURRENT_USER\Software\Ghisler\Total Commander\IniFileName

Если это значение непусто, берем его. Иначе:

5. Смотрим значение ключа реестра

HKEY_LOCAL_MACHINE\Software\Ghisler\Total Commander\IniFileName

Если это значение непусто, берем его. Иначе:

6. Берем имя файла по умолчанию, которое:[4]

  • в Windows Vista и системах, в которых запрещена запись в каталог Windows:
%AppData%\Ghisler\wincmd.ini
  • в прочих системах (в том числе в Windows 9x):
%Windir%\wincmd.ini

Алгоритм поиска файла настроек FTP-соединений

Почти все то же самое, что и в предыдущем пункте о файле основных настроек, с отличиями:

  • Опускается первый шаг с переменной окружения. Пока у нас нет переменной, отвечающей за файл настроек FTP.
  • Ключи в реестре берутся из тех же веток, только имя у них другое:
HKEY_CURRENT_USER\Software\Ghisler\Total Commander\FtpIniName
HKEY_LOCAL_MACHINE\Software\Ghisler\Total Commander\FtpIniName
  • На последнем шаге файл берется в тех же каталогах, только имя у него другое: не "wincmd.ini", а "wcx_ftp.ini".

Замечания по поводу ключей реестра

1. В ключах, хранящих путь к ini-файлам TC, может быть записан как полный путь к файлу, так и относительный путь. [5]

Утилита IniReloc при записи этих ключей позволяет себе писать их в виде ".\имя_файла", т.е. с точкой вместо пути. В этом случае, наша программа должна понимать "точку" как путь к каталогу TC, найденному в начале статьи.

Если же путь к каталогу TC не мог быть вычислен, относительный путь (он мог остаться после ручного удаления TC) означает, что соответствующий шаг алгоритма надо пропустить.

2. Следует учитывать, что в ключах могут быть использованы переменные окружения, например: "%AppData%\Ghisler\wincmd.ini".

Если используется переменная, которая не может быть расширена (функцией ExpandEnvironmentStrings), соответствующий шаг алгоритма надо пропустить.

3. Значения в HKEY_CURRENT_USER пишутся утилитой IniReloc при сохранении в ней настроек только для текущего пользователя системы. Значения же в HKEY_LOCAL_MACHINE пишутся при выборе в IniReloc "Сохранять для всех пользователей в системе".


Общие замечания

1. Возможна ситуация, когда у пользователя установленно несколько копий TC. В этом случае чтением реестра мы найдем лишь одну копию TC. А с учетом того, что какая-то копия может хранить настройки в своем каталоге, а какая-то - в каталоге %AppData%, мы вообще получим путаницу. Поэтому в случае такой конфигурации у пользователя Вы обязаны предупредить его, чтобы он запускал вашу программу первый раз только из-под Total Commander, а также использовал новые версии TC (6.55 и новее).

Только тогда программа правильно определит пути к файлам (файлу приложения и основному файлу настроек) каждой копии TC через переменные окружения. С файлом настроек FTP-соединений сложнее: определить его путь (для каждой копии) не удастся даже при запуске из-под TC!


Примечания по ходу текста

  1. Считаем, что имя файла приложения у нас - "Totalcmd.exe". Если это не так (пользователь переименовал файл), будет трудно найти файл приложения. Я рекомендую полагаться на имя "Totalcmd.exe". Если очень нужно искать переименованный файл: можно искать все *.exe файлы в найденном каталоге и выбирать первый из них, который в структуре VersionInfo в поле InternalName имеет значение TOTALCMD.
  2. Можно упомянуть о том, почему в ReloadTC использован именно этот способ: "Собственно, в случае именно этой программы, из-за некоторой её специфики, более корректного способа получить путь не существует. Программа должна перезапускать открытую копию TC, а не какую-то иную, даже если запущенная копия не зарегистрирована в реестре".
  3. Цитата
    UseIniInProgramDir=0

    Это значение будет приниматься во внимание лишь тогда, когда файл wincmd.ini находится в том же каталоге, что и программа. Если положение INI-файлов было задано через параметры командной строки, то независимо от значения данного ключа будут использоваться именно указанные файлы. В противном случае значение данного ключа трактуется как сумма следующих параметров:

    • 1. Использовать файл wincmd.ini, расположенный в каталоге программы, если в реестре не задано иное расположение.
    • 2. Использовать файл wcx_ftp.ini, расположенный в каталоге программы, если в реестре не задано иное расположение.
    • 4. Полностью игнорировать информацию в реестре о расположении файлов wincmd.ini и wcx_ftp.ini.
    Русская справка по Total Commander

  4. Цитата
    • Добавлено: Инсталлятор: В NT/2000/XP устанавливается местоположение по умолчанию для ini-файлов как %AppData%\Ghisler, если запрещена запись в каталог Windows (для учётных записей пользователей, не имеющих прав администратора).
    • Добавлено: Инсталлятор: В Windows Vista устанавливается местоположение по умолчанию для ini-файлов как %AppData%\Ghisler...
    Поясняющие цитаты из истории версий TC

  5. В каких случаях IniReloc пишет в реестр относительный путь? Насколько мне известно, только в случае помещения файлов в каталог TC.


Алексей Торгашин

© 2007