пятница, 22 октября 2010 г.

Не забывайте передавать текущий каталог вместе с командной строкой в ваших приложениях с одним экземпляром

Это перевод Don't forget to pass the current directory along with the command line to your single-instance program. Автор: Реймонд Чен.

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

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

Позвольте мне дать конкретный пример.
C:\Directory1> start LitWare file1.lit
... запускает LitWare с файлом C:\Directory1\file1.lit ...
C:\Directory1> cd ..\Directory2
C:\Directory2> start LitWare file2.lit
Что вы ожидаете от последней команды? Наверное, что она откроет файл C:\Directory2\file2.lit, поскольку относительный путь file2.lit должен быть разрешён относительно текущего каталога C:\Directory2. К сожалению, я видел некоторые программы◊, которые пытаются открыть файл C:\Directory1\file2.lit, поскольку они передают командную строку первой копии, а первая копия трактует путь file2.lit относительно своего текущего каталога - C:\Directory1.

Результат: "Файл не найден." (прим.пер.: это если вам повезёт. Если вам не повезёт - программа обработает не тот файл)

Мораль истории: не забывайте про текущий каталог, когда вы обрабатываете командную строку. Вы можете либо позволить второй копии разрешить пути относительно своего текущего каталога (и передать первой копии абсолютные пути), либо вы можете передать текущий каталог первой копии (и она разрешит относительные пути относительно этого каталога). Любой способ сработает. А вот передача относительных путей в первую копию, которая будет разрешать их относительно своего текущего каталога - не сработает.

Я использую такой обходной путь для работы с такими бажными программами: использование переменной окружения %CD%:
C:\Directory2> start LitWare %CD%\file2.lit
Псевдо-переменная %CD% разворачивается в текущий каталог командной строки (не забудьте про кавычки, если путь содержит пробелы).

Уголок зануды

◊ Напоминаю, что фраза "некоторые программы" означает "некоторые программы". А программы Microsoft попадают в категорию "программы"☼.
☼ Да, я использую странные символы в качестве маркеров примечаний. Я надеюсь, что люди, которые придираются к моему выбору маркеров, расстроятся так сильно, что их головы взорвутся, и поэтому они не смогут больше занудствовать дальше. С другой стороны, похоже, что некоторые люди страдают от болезни, которая отключает в мозгу центр "веселья".

Комментариев нет:

Отправить комментарий

Можно использовать некоторые HTML-теги, например:

<b>Жирный</b>
<i>Курсив</i>
<a href="http://www.example.com/">Ссылка</a>

Вам необязательно регистрироваться для комментирования - для этого просто выберите из списка "Анонимный" (для анонимного комментария) или "Имя/URL" (для указания вашего имени и ссылки на сайт). Все прочие варианты потребуют от вас входа в вашу учётку (поддерживается OpenID).

Пожалуйста, по возможности используйте "Имя/URL" вместо "Анонимный". URL можно просто не указывать.

Ваше сообщение может быть помечено как спам спам-фильтром - не волнуйтесь, оно появится после проверки администратором.