OberonCore

Библиотека  Wiki  Форум  BlackBox  Компоненты  Проекты
Текущее время: Четверг, 19 Июнь, 2025 01:56

Часовой пояс: UTC + 3 часа




Начать новую тему Ответить на тему  [ Сообщений: 40 ]  На страницу 1, 2  След.
Автор Сообщение
СообщениеДобавлено: Четверг, 02 Апрель, 2009 14:18 

Зарегистрирован: Четверг, 02 Апрель, 2009 13:42
Сообщения: 23
Допустим, мой BlackBox.exe лежит в какой-нибудь произвольной директории. Каким путем я могу в переменную строкового типа вернуть эту самую директорию? Может подсистема какая нибудь есть? Подскажите пожалуйста, заранее спасибо.


Вернуться к началу
 Профиль  
 
СообщениеДобавлено: Четверг, 02 Апрель, 2009 14:59 

Зарегистрирован: Понедельник, 30 Июль, 2007 10:53
Сообщения: 1538
Откуда: Беларусь, Минск
Если файл лежит в текущем каталоге (а при запуске приложений в ОС Windows так оно обычно и бывает), то можно сделать следующее:

Код:
      loc := Files.dir.This( "" );
      Log.String( loc( HostFiles.Locator ).path );


Вернуться к началу
 Профиль  
 
СообщениеДобавлено: Четверг, 02 Апрель, 2009 19:11 

Зарегистрирован: Четверг, 02 Апрель, 2009 13:42
Сообщения: 23
А у loc какой тип? Files.Directory?


Вернуться к началу
 Профиль  
 
СообщениеДобавлено: Четверг, 02 Апрель, 2009 19:25 

Зарегистрирован: Вторник, 29 Август, 2006 12:32
Сообщения: 2662
Откуда: Россия, Ярославль
Тип Files.Locator.

Код:
DEFINITION Files;
...
Directory = POINTER TO ABSTRACT RECORD
         ...
       (d: Directory) This (IN path: ARRAY OF CHAR): Locator, NEW, ABSTRACT
      END;


Вернуться к началу
 Профиль  
 
СообщениеДобавлено: Четверг, 02 Апрель, 2009 20:26 

Зарегистрирован: Понедельник, 30 Июль, 2007 10:53
Сообщения: 1538
Откуда: Беларусь, Минск
Да, забыл указать тип...

И ещё: это был пример для понимания сути. В том виде, как я это показал, использовать идею не стоит, потому что Files.Locator не обязательно должен расширяться именно HostFiles.Locator-ом. В общем случае он может быть и чем-нибудь другим, поэтому проверяйте тип при выполнении второй строки.


Вернуться к началу
 Профиль  
 
СообщениеДобавлено: Пятница, 03 Апрель, 2009 01:37 

Зарегистрирован: Суббота, 26 Ноябрь, 2005 10:37
Сообщения: 875
Откуда: Россия, Владивосток
Valery Solovey писал(а):
Если файл лежит в текущем каталоге (а при запуске приложений в ОС Windows так оно обычно и бывает), то можно сделать следующее:


Но при использовании ключа -USE возвращаться будет именно "рабочий" каталог. Так что только через WinApi


Вернуться к началу
 Профиль  
 
СообщениеДобавлено: Пятница, 03 Апрель, 2009 15:07 

Зарегистрирован: Четверг, 02 Апрель, 2009 13:42
Сообщения: 23
О! Класс. Все работает. :D Только последний вопрос...а как к ней теперь обращаться?

Код:
IF MtFiles.ExistsFile(Files.dir.This(???), 't.txt') = FALSE THEN.....


Вернуться к началу
 Профиль  
 
СообщениеДобавлено: Пятница, 03 Апрель, 2009 15:47 

Зарегистрирован: Вторник, 29 Август, 2006 12:32
Сообщения: 2662
Откуда: Россия, Ярославль
к любому каталогу внутри ББ можно обратиться вот так: 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


Вернуться к началу
 Профиль  
 
СообщениеДобавлено: Пятница, 03 Апрель, 2009 16:39 

Зарегистрирован: Четверг, 02 Апрель, 2009 13:42
Сообщения: 23
Пётр Кушнир писал(а):
к любому каталогу внутри ББ можно обратиться вот так: 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 

Зарегистрирован: Вторник, 29 Август, 2006 12:32
Сообщения: 2662
Откуда: Россия, Ярославль
Вам же ещё раньше ответили про местоположение "ядра". Всё просто, если все каталоги внутри ББ определяются как "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 

Зарегистрирован: Вторник, 29 Август, 2006 12:32
Сообщения: 2662
Откуда: Россия, Ярославль
А в чём состоит ваша задача, если не секрет?


Вернуться к началу
 Профиль  
 
СообщениеДобавлено: Пятница, 03 Апрель, 2009 18:57 
Аватара пользователя

Зарегистрирован: Понедельник, 14 Ноябрь, 2005 18:39
Сообщения: 9459
Откуда: Россия, Орёл
Там строковое представление пути, действительно, получить не очень легко. Я когда-то выкручивался через Kernel, извлекая внутреннее поле name от HostFiles.Locator.


Вернуться к началу
 Профиль  
 
СообщениеДобавлено: Пятница, 03 Апрель, 2009 18:58 

Зарегистрирован: Четверг, 02 Апрель, 2009 13:42
Сообщения: 23
Огромное спасибо, Петр

SanekSunshine писал(а):
Не спрашивайте зачем:)


Я знал, что вы спросите :)

Моя задача - исправить трапающее сохранение свойств сессии при распространении на доменах сервера. Т.к. путь на сервер закрыт, требуется сохранять файл на полный путь, не на относительный (рядом с загрузочным пакетиком, плюс в паре подкаталогов).

Илья Ермаков писал(а):
Там строковое представление пути, действительно, получить не очень легко.


Ууф....Вот уж точно)))))


Последний раз редактировалось SanekSunshine Пятница, 03 Апрель, 2009 18:59, всего редактировалось 1 раз.

Вернуться к началу
 Профиль  
 
СообщениеДобавлено: Пятница, 03 Апрель, 2009 21:41 
Аватара пользователя

Зарегистрирован: Вторник, 19 Сентябрь, 2006 21:54
Сообщения: 2461
Откуда: Россия, Томск
SanekSunshine писал(а):
Илья Ермаков писал(а):
Там строковое представление пути, действительно, получить не очень легко.
Ууф....Вот уж точно)))))
Если так уж сильно надо, добавьте объекту HostFiles.Locator метод GetPath, и пусть возвращает вам строку.


Вернуться к началу
 Профиль  
 
СообщениеДобавлено: Суббота, 04 Апрель, 2009 10:13 

Зарегистрирован: Вторник, 13 Ноябрь, 2007 20:38
Сообщения: 1056
Александр Ильин писал(а):
SanekSunshine писал(а):
Илья Ермаков писал(а):
Там строковое представление пути, действительно, получить не очень легко.
Ууф....Вот уж точно)))))
Если так уж сильно надо, добавьте объекту HostFiles.Locator метод GetPath, и пусть возвращает вам строку.
Одно маленькое уточнение (хотя думаю Александр это и имел ввиду :) ). Метод нужно добавлять в модуле Files, а в HostFiles добавить реализацию этого метода. Потому как прикладной модуль хоть и может, но не должен мпортировать модуль реализации, так как на корню рубит саму идею, ради которой создавался модуль реализации.


Вернуться к началу
 Профиль  
 
СообщениеДобавлено: Суббота, 04 Апрель, 2009 12:23 

Зарегистрирован: Вторник, 29 Август, 2006 12:32
Сообщения: 2662
Откуда: Россия, Ярославль
И ещё, как только вы добавите такой метод, так тут же потеряете совместимость со всеми остальными оригинальными экземплярами ББ, поэтому такой вариант даже нельзя рассматривать. Разве что в качестве мысленного экспериимента :)


Вернуться к началу
 Профиль  
 
СообщениеДобавлено: Суббота, 04 Апрель, 2009 12:43 

Зарегистрирован: Четверг, 02 Апрель, 2009 13:42
Сообщения: 23
Почему? Он же будет действовать в пределах только этого бб... В другом просто не будет и упоминания о нем :?: :| Совсем другое дело, как это все "сварить".)


Вернуться к началу
 Профиль  
 
СообщениеДобавлено: Суббота, 04 Апрель, 2009 14:21 
Модератор
Аватара пользователя

Зарегистрирован: Среда, 16 Ноябрь, 2005 00:53
Сообщения: 4625
Откуда: Россия, Орёл
SanekSunshine писал(а):
Он же будет действовать в пределах только этого бб...
Если Вам нужно решить конкретную задачу и это поможет, имхо - делайте.
Игорь Лоскутов писал(а):
Одно маленькое уточнение (хотя думаю Александр это и имел ввиду :) ). Метод нужно добавлять в модуле Files, а в HostFiles добавить реализацию этого метода...
Если изменить интерфейс в Files, которым пользуется весь ББ, то "сварить" (скомпилировать) это действительно будет сложно; при этом всему ББ такая функция не нужна. Она нужна нам, в конкретном месте; мы про неё знаем, и, через приведение типа всегда вызовем... Хотя тогда не понятно, в чём разница между функцией и обращением к полю path...

Теперь слово предоставляется Александру - пусть пояснит, что он имел ввиду. :)


Вернуться к началу
 Профиль  
 
СообщениеДобавлено: Суббота, 04 Апрель, 2009 16:16 
Аватара пользователя

Зарегистрирован: Вторник, 19 Сентябрь, 2006 21:54
Сообщения: 2461
Откуда: Россия, Томск
Евгений Темиргалеев писал(а):
Теперь слово предоставляется Александру - пусть пояснит, что он имел ввиду. :)
Я, в общем-то, имел в виду то, что написал. Если интересует мой вариант обоснования, то оно у меня таково. Если нужно платформенно-зависимое решение (а пути в 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 
Аватара пользователя

Зарегистрирован: Вторник, 19 Сентябрь, 2006 21:54
Сообщения: 2461
Откуда: Россия, Томск
Игорь Лоскутов писал(а):
Потому как прикладной модуль хоть и может, но не должен мпортировать модуль реализации, так как на корню рубит саму идею, ради которой создавался модуль реализации.
Вы хотели сказать, что это рубит идею, ради которой создавался абстрактный модуль, а не модуль реализации. : )

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


Вернуться к началу
 Профиль  
 
Показать сообщения за:  Поле сортировки  
Начать новую тему Ответить на тему  [ Сообщений: 40 ]  На страницу 1, 2  След.

Часовой пояс: UTC + 3 часа


Кто сейчас на конференции

Сейчас этот форум просматривают: нет зарегистрированных пользователей и гости: 1


Вы не можете начинать темы
Вы не можете отвечать на сообщения
Вы не можете редактировать свои сообщения
Вы не можете удалять свои сообщения
Вы не можете добавлять вложения

Найти:
cron
Вся информация, размещаемая участниками на конференции (тексты сообщений, вложения и пр.) © 2005-2025, участники конференции «OberonCore», если специально не оговорено иное.
Администрация не несет ответственности за мнения, стиль и достоверность высказываний участников, равно как и за безопасность материалов, предоставляемых участниками во вложениях.
Без разрешения участников и ссылки на конференцию «OberonCore» любое воспроизведение и/или копирование высказываний полностью и/или по частям запрещено.
Powered by phpBB® Forum Software © phpBB Group
Русская поддержка phpBB