OberonCore https://forum.oberoncore.ru/ |
|
Как вернуть в строку путь к ядру, которое сейчас запущено? https://forum.oberoncore.ru/viewtopic.php?f=1&t=1439 |
Страница 1 из 2 |
Автор: | SanekSunshine [ Четверг, 02 Апрель, 2009 14:18 ] |
Заголовок сообщения: | Как вернуть в строку путь к ядру, которое сейчас запущено? |
Допустим, мой BlackBox.exe лежит в какой-нибудь произвольной директории. Каким путем я могу в переменную строкового типа вернуть эту самую директорию? Может подсистема какая нибудь есть? Подскажите пожалуйста, заранее спасибо. |
Автор: | Valery Solovey [ Четверг, 02 Апрель, 2009 14:59 ] |
Заголовок сообщения: | Re: Как вернуть в строку путь к ядру, которое сейчас запущено? |
Если файл лежит в текущем каталоге (а при запуске приложений в ОС Windows так оно обычно и бывает), то можно сделать следующее: Код: loc := Files.dir.This( "" );
Log.String( loc( HostFiles.Locator ).path ); |
Автор: | SanekSunshine [ Четверг, 02 Апрель, 2009 19:11 ] |
Заголовок сообщения: | Re: Как вернуть в строку путь к ядру, которое сейчас запущено? |
А у loc какой тип? Files.Directory? |
Автор: | Пётр Кушнир [ Четверг, 02 Апрель, 2009 19:25 ] |
Заголовок сообщения: | Re: Как вернуть в строку путь к ядру, которое сейчас запущено? |
Тип Files.Locator. Код: DEFINITION Files;
... Directory = POINTER TO ABSTRACT RECORD ... (d: Directory) This (IN path: ARRAY OF CHAR): Locator, NEW, ABSTRACT END; |
Автор: | Valery Solovey [ Четверг, 02 Апрель, 2009 20:26 ] |
Заголовок сообщения: | Re: Как вернуть в строку путь к ядру, которое сейчас запущено? |
Да, забыл указать тип... И ещё: это был пример для понимания сути. В том виде, как я это показал, использовать идею не стоит, потому что Files.Locator не обязательно должен расширяться именно HostFiles.Locator-ом. В общем случае он может быть и чем-нибудь другим, поэтому проверяйте тип при выполнении второй строки. |
Автор: | Иван Горячев [ Пятница, 03 Апрель, 2009 01:37 ] |
Заголовок сообщения: | Re: Как вернуть в строку путь к ядру, которое сейчас запущено? |
Valery Solovey писал(а): Если файл лежит в текущем каталоге (а при запуске приложений в ОС Windows так оно обычно и бывает), то можно сделать следующее: Но при использовании ключа -USE возвращаться будет именно "рабочий" каталог. Так что только через WinApi |
Автор: | SanekSunshine [ Пятница, 03 Апрель, 2009 15:07 ] |
Заголовок сообщения: | Re: Как вернуть в строку путь к ядру, которое сейчас запущено? |
О! Класс. Все работает. ![]() Код: IF MtFiles.ExistsFile(Files.dir.This(???), 't.txt') = FALSE THEN.....
|
Автор: | Пётр Кушнир [ Пятница, 03 Апрель, 2009 15:47 ] |
Заголовок сообщения: | Re: Как вернуть в строку путь к ядру, которое сейчас запущено? |
к любому каталогу внутри ББ можно обратиться вот так: Catalog/subcatalog/subsubcatalog и т.д. Например "Std/Rsrc" указывает на подкаталог Rsrc подсистемы Std И ещё: SanekSunshine писал(а): Код: IF MtFiles.ExistsFile(Files.dir.This(???), 't.txt') = FALSE THEN Код: IF ~MtFiles.ExistsFile(Files.dir.This(???), 't.txt') THEN
|
Автор: | SanekSunshine [ Пятница, 03 Апрель, 2009 16:39 ] |
Заголовок сообщения: | Re: Как вернуть в строку путь к ядру, которое сейчас запущено? |
Пётр Кушнир писал(а): к любому каталогу внутри ББ можно обратиться вот так: Catalog/subcatalog/subsubcatalog и т.д. Например "Std/Rsrc" указывает на подкаталог Rsrc подсистемы Std И ещё: SanekSunshine писал(а): Код: IF MtFiles.ExistsFile(Files.dir.This(???), 't.txt') = FALSE THEN Код: IF ~MtFiles.ExistsFile(Files.dir.This(???), 't.txt') THEN Это-то я знаю, спасибо, просто сейчас требуется узнать ИМЕННО местоположение ядра, там находится файл...В полях loc нет строковых массивов, следовательно их никак не вызвать, от того сейчас на душе тяжко... Мне интересно, как в переменную Files.Locator можно сохранить директорию и как ее потом оттуда "достать"? Не спрашивайте зачем:) |
Автор: | Пётр Кушнир [ Пятница, 03 Апрель, 2009 16:54 ] |
Заголовок сообщения: | Re: Как вернуть в строку путь к ядру, которое сейчас запущено? |
Вам же ещё раньше ответили про местоположение "ядра". Всё просто, если все каталоги внутри ББ определяются как "Catalog", то путь к ББ будет записываться пустой строкой, ведь никаких подкаталогов нет. В ББ зачастую вообще не нужно знать текстовое представление пути. Только при создании локатора. Дальше можно оперировать локатором, при необходимости вычисляя путь, как в примере Valery Solovey через приведение типа к типу реализации. Код: PROCEDURE Open; VAR f : Files.File; loc : Files.Locator; BEGIN loc:=Files.dir.This(''); (* создаём локатор *) f:=Files.dir.Old(loc, 't.txt', Files.shared); (* открываем файл в режиме shared, то есть неблокирующий доступ *) IF f#NIL THEN (* файл успешно открылся *) ELSE Log.String('Файл не найден. Код ошибки '); Log.Int(loc.res) END; (* иначе код ошибки будет содержаться в поле loc.res *) END Open; то же самое с Код: IF MtFiles.ExistsFile(Files.dir.This(''), 't.txt') THEN
|
Автор: | Пётр Кушнир [ Пятница, 03 Апрель, 2009 17:31 ] |
Заголовок сообщения: | Re: Как вернуть в строку путь к ядру, которое сейчас запущено? |
А в чём состоит ваша задача, если не секрет? |
Автор: | Илья Ермаков [ Пятница, 03 Апрель, 2009 18:57 ] |
Заголовок сообщения: | Re: Как вернуть в строку путь к ядру, которое сейчас запущено? |
Там строковое представление пути, действительно, получить не очень легко. Я когда-то выкручивался через Kernel, извлекая внутреннее поле name от HostFiles.Locator. |
Автор: | SanekSunshine [ Пятница, 03 Апрель, 2009 18:58 ] |
Заголовок сообщения: | Re: Как вернуть в строку путь к ядру, которое сейчас запущено? |
Огромное спасибо, Петр SanekSunshine писал(а): Не спрашивайте зачем:) Я знал, что вы спросите ![]() Моя задача - исправить трапающее сохранение свойств сессии при распространении на доменах сервера. Т.к. путь на сервер закрыт, требуется сохранять файл на полный путь, не на относительный (рядом с загрузочным пакетиком, плюс в паре подкаталогов). Илья Ермаков писал(а): Там строковое представление пути, действительно, получить не очень легко. Ууф....Вот уж точно))))) |
Автор: | Александр Ильин [ Пятница, 03 Апрель, 2009 21:41 ] |
Заголовок сообщения: | Re: Как вернуть в строку путь к ядру, которое сейчас запущено? |
SanekSunshine писал(а): Илья Ермаков писал(а): Там строковое представление пути, действительно, получить не очень легко. Ууф....Вот уж точно))))) |
Автор: | igor [ Суббота, 04 Апрель, 2009 10:13 ] |
Заголовок сообщения: | Re: Как вернуть в строку путь к ядру, которое сейчас запущено? |
Александр Ильин писал(а): SanekSunshine писал(а): Илья Ермаков писал(а): Там строковое представление пути, действительно, получить не очень легко. Ууф....Вот уж точно)))))![]() |
Автор: | Пётр Кушнир [ Суббота, 04 Апрель, 2009 12:23 ] |
Заголовок сообщения: | Re: Как вернуть в строку путь к ядру, которое сейчас запущено? |
И ещё, как только вы добавите такой метод, так тут же потеряете совместимость со всеми остальными оригинальными экземплярами ББ, поэтому такой вариант даже нельзя рассматривать. Разве что в качестве мысленного экспериимента ![]() |
Автор: | SanekSunshine [ Суббота, 04 Апрель, 2009 12:43 ] |
Заголовок сообщения: | Re: Как вернуть в строку путь к ядру, которое сейчас запущено? |
Почему? Он же будет действовать в пределах только этого бб... В другом просто не будет и упоминания о нем ![]() ![]() |
Автор: | Евгений Темиргалеев [ Суббота, 04 Апрель, 2009 14:21 ] |
Заголовок сообщения: | Re: Как вернуть в строку путь к ядру, которое сейчас запущено? |
SanekSunshine писал(а): Он же будет действовать в пределах только этого бб... Если Вам нужно решить конкретную задачу и это поможет, имхо - делайте.Игорь Лоскутов писал(а): Одно маленькое уточнение (хотя думаю Александр это и имел ввиду Если изменить интерфейс в Files, которым пользуется весь ББ, то "сварить" (скомпилировать) это действительно будет сложно; при этом всему ББ такая функция не нужна. Она нужна нам, в конкретном месте; мы про неё знаем, и, через приведение типа всегда вызовем... Хотя тогда не понятно, в чём разница между функцией и обращением к полю path...![]() Теперь слово предоставляется Александру - пусть пояснит, что он имел ввиду. ![]() |
Автор: | Александр Ильин [ Суббота, 04 Апрель, 2009 16:16 ] |
Заголовок сообщения: | Re: Как вернуть в строку путь к ядру, которое сейчас запущено? |
Евгений Темиргалеев писал(а): Теперь слово предоставляется Александру - пусть пояснит, что он имел ввиду. :) Я, в общем-то, имел в виду то, что написал. Если интересует мой вариант обоснования, то оно у меня таково. Если нужно платформенно-зависимое решение (а пути в Windows отличаются от путей в Linux, например), то лучше импортировать HostFiles, подчеркнув эту зависимость. В этом случае правится только один модуль (HostFiles), а не два (Files и HostFiles), так что необходимые изменения лучше локализованы. Если волнует совместимость с другими дистрибутивами ББ (что довольно редкий случай само по себе), то ещё возможен вариант создания собственного драйвера, например, с именем PrivHostFiles, и последующее прямое использование этого модуля при проверке типа: WITH loc: PrivHostFiles.Locator DO... Реализацию PrivHostFiles можно получить копированием HostFiles в подсистему Priv (имя Priv зарезервировано для частного использования, поэтому не может конфликтовать с другими подсистемами ББ) и добавлением нужных функций, либо публикацией нужных полей, если они уже там есть.Насчёт того, что идея рубится на корню, то тут трудно что-то сказать однозначно. Например, почему нет такой функции в Files как "вернуть путь в виде строки"? Потому, что Files независим от платформы, а строка имеет зависимый формат. С другой стороны, модуль Files готов принимать строки в платформенно-зависимом формате и на их основе делать Locator'ы, например. Получается асимметрия интерфейса. Для этого есть особая причина (не вижу) или это упущение дизайнера модуля? Абстрактный модуль, насколько я понимаю, должен предоставлять интерфейс, который является общим для всех платформ. При этом неизбежно и необходимо что-то упустить из виду (например, тот факт, что для каждого диска Windows помнит "текущий каталог", в который мы попадаем, набрав в командной строке только имя диска c: или d: - в Linux, где единая файловая система данный концепт просто не имеет смысла, так как там нет дисков, а есть единое дерево каталогов и устройств с общим корнем). Расширять абстрактный модуль вряд ли имеет смысл без тщательно продуманного обоснования, тем более если наша цель - получить платформенно-зависимую информацию. В данной конкретной задаче проблема в том, что фремворк ББ редиректом /USE спрятал от нас знание о пути к BlackBox.exe, которое тем не менее, может пригодиться в каких-то задачах. Выхода два - либо поправить фреймворк, либо обратиться к средствам платформы (например, узнать путь к исполнимому модулю по хэндлу текущего процесса). Первое ведёт к несовместимости вашей подсистемы с другими ББ, второе ведёт к несовместимости с другими платформами. Смотрите, что вам важнее. Многое зависит от конкретной задачи - например, от того, планируется ли распостранять результат в виде подсистемы под разные ББ, или как скомпонованное приложение в виде exe-модуля. Не зная всей полноты условий, я могу только поделиться общими соображениями, что и сделал в данном посте. Спасибо за внимание. |
Автор: | Александр Ильин [ Суббота, 04 Апрель, 2009 16:30 ] |
Заголовок сообщения: | Re: Как вернуть в строку путь к ядру, которое сейчас запущено? |
Игорь Лоскутов писал(а): Потому как прикладной модуль хоть и может, но не должен мпортировать модуль реализации, так как на корню рубит саму идею, ради которой создавался модуль реализации. Вы хотели сказать, что это рубит идею, ради которой создавался абстрактный модуль, а не модуль реализации. : )Мой ответ будет такой. Поскольку абстрактный модуль создавался для независимости от платформы (а не от реализации), то платформенно-зависимые модули, в том числе из пользовательского приложения, вполне могут обращаться к ним напрямую, если те предоставляют необходимую информацию, отсутствующую в абстрактном интерфейсе. Мы же не удивляемся тому, что модули подсистемы Host могут импортировать друг друга напрямую. Если не получается написать на абстрактном интерфейсе, то всего лишь получим платформенно-зависимое приложение. Ничего особо страшного в этом нет, полно задач можно найти, необходимых на одной платформе и бессмысленных на другой (например, узнать текущий путь того или иного диска, см. пред. пост). Если нужна и специфика, и независимость, то придётся выкручиваться иначе - либо дорабатывать каркас, либо вводить собственную прослойку (драйвера - аналоги Host*). |
Страница 1 из 2 | Часовой пояс: UTC + 3 часа |
Powered by phpBB® Forum Software © phpBB Group https://www.phpbb.com/ |