OberonCore

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

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




Начать новую тему Ответить на тему  [ Сообщений: 40 ]  На страницу Пред.  1, 2
Автор Сообщение
СообщениеДобавлено: Суббота, 04 Апрель, 2009 16:36 
Аватара пользователя

Зарегистрирован: Вторник, 19 Сентябрь, 2006 21:54
Сообщения: 2461
Откуда: Россия, Томск
Евгений Темиргалеев писал(а):
Хотя тогда не понятно, в чём разница между функцией и обращением к полю path...
Если там есть такое поле, то разницы, конечно, нет. Я просто давно-о не заглядывал в HostFiles.


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

Зарегистрирован: Вторник, 29 Август, 2006 12:32
Сообщения: 2662
Откуда: Россия, Ярославль
Обсуждение сабжа изменения хост-части(да и вообще, стандартных подсистем) под себя viewtopic.php?f=47&t=1446

UPD: ссылку обновил, извините, конфуз вышел.


Последний раз редактировалось Пётр Кушнир Суббота, 04 Апрель, 2009 18:20, всего редактировалось 2 раз(а).

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

Зарегистрирован: Вторник, 15 Ноябрь, 2005 01:14
Сообщения: 4722
Откуда: Россия, Орёл
Пётр Кушнир писал(а):
Можно даже в отдельной теме обсудить.

Чего и рекомендуется сделать.


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

Зарегистрирован: Вторник, 13 Ноябрь, 2007 20:38
Сообщения: 1056
Александр Ильин писал(а):
Не зная всей полноты условий, я могу только поделиться общими соображениями ...
Я соглашусь с Александром, что в ситуации, которую мы рассматриваем, слишком много "если..." Я исхожу вот из каких соображений. Блэкбокс создавался для решения прикладных задач. Если кто-то в этом сомневается, то пусть попробует написать что-то типа FileMon как у Руссиновича. Я не говорю, что это не возможно. В конечном итоге файловый монитор будет написан, но для этого придётся сделать слишком много исключений из правил. Для чисто прикладной задачи никогда не понадобится напрямую работать с файловыми директориями в терминах целевой платформы. Если же такая необходимость всё-таки есть, то Блэкбокс, ИМХО, слабо подходит для таких задач. Необходимо лезть в каркас или в модули портирования (Host) и что-то там переделывать. Само по себе в этом ничего страшного нет, ведь задачи, которые перед нами стоят при реализации какого-либо проекта, в любом случае должны быть решены. Но нужно понимать, что любая переделка каркаса -- это очень ответсвенная работа, так как новый изменённый каркас многократно будет использован в будущем. Если вскоре выяснится, что там опять что-то надо менять, то это и не каркас вовсе, а так баловство одно.

Имхо, каркас в Блэкбокс разработан очень хорошо (Шиперски и Пфистер постарались :) ), и в нём ничего переделывать не нужно. Если же попалась задача, для которой он не подходит, то нужно искать частное решение, которое будет использовано только в этой задаче.

Если кто-то считает, что каркас в Блэкбоксе всё-же недостаточно хорош и его надо переделать, то начинать нужно с разработки новой концепции и с ответов на главные вопросы, типа "а зачем это надо?", "а какая цель?" и так далее.


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

Зарегистрирован: Вторник, 19 Сентябрь, 2006 21:54
Сообщения: 2461
Откуда: Россия, Томск
Пётр Кушнир писал(а):
Обсуждение сабжа изменения хост-части(да и вообще, стандартных подсистем) под себя viewtopic.php?f=69&t=1445
"Вы не авторизованы для чтения этого форума".


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

Зарегистрирован: Вторник, 13 Ноябрь, 2007 20:38
Сообщения: 1056
Александр Ильин писал(а):
Пётр Кушнир писал(а):
Обсуждение сабжа изменения хост-части(да и вообще, стандартных подсистем) под себя viewtopic.php?f=69&t=1445
"Вы не авторизованы для чтения этого форума".
Аналогично :(


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

Зарегистрирован: Четверг, 02 Апрель, 2009 13:42
Сообщения: 23
Valery Solovey писал(а):
Если файл лежит в текущем каталоге (а при запуске приложений в ОС Windows так оно обычно и бывает), то можно сделать следующее:

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


Пётр Кушнир писал(а):
к любому каталогу внутри ББ можно обратиться вот так: 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


Илья Ермаков писал(а):
Там строковое представление пути, действительно, получить не очень легко. Я когда-то выкручивался через Kernel, извлекая внутреннее поле name от HostFiles.Locator.


Александр Ильин писал(а):
Насчёт того, что идея рубится на корню, то тут трудно что-то сказать однозначно. Например, почему нет такой функции в Files как "вернуть путь в виде строки"? Потому, что Files независим от платформы, а строка имеет зависимый формат. С другой стороны, модуль Files готов принимать строки в платформенно-зависимом формате и на их основе делать Locator'ы, например. Получается асимметрия интерфейса. Для этого есть особая причина (не вижу) или это упущение дизайнера модуля?

Абстрактный модуль, насколько я понимаю, должен предоставлять интерфейс, который является общим для всех платформ. При этом неизбежно и необходимо что-то упустить из виду (например, тот факт, что для каждого диска Windows помнит "текущий каталог", в который мы попадаем, набрав в командной строке только имя диска c: или d: - в Linux, где единая файловая система данный концепт просто не имеет смысла, так как там нет дисков, а есть единое дерево каталогов и устройств с общим корнем). Расширять абстрактный модуль вряд ли имеет смысл без тщательно продуманного обоснования, тем более если наша цель - получить платформенно-зависимую информацию. В данной конкретной задаче проблема в том, что фремворк ББ редиректом /USE спрятал от нас знание о пути к BlackBox.exe, которое тем не менее, может пригодиться в каких-то задачах. Выхода два - либо поправить фреймворк, либо обратиться к средствам платформы (например, узнать путь к исполнимому модулю по хэндлу текущего процесса). Первое ведёт к несовместимости вашей подсистемы с другими ББ, второе ведёт к несовместимости с другими платформами.
...


Обработав (это оч. сжато) полученную информацию, я немного пошаманил и получил следущее (хочу отметить, по поводу совместимости, что идею
Пётр Кушнир писал(а):
Код:
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

я еще не использовал):

Код:
...
TYPE Location = Files.Locator;

VAR ...
      bbLocator,loc:Location;

   PROCEDURE Wai;
   BEGIN
      bbLocator:= Files.dir.This("");
      loc := Files.dir.This(bbLocator(HostFiles.Locator).path+path);
   END Wai;
       

        ...
   Wai;
   IF ~MtFiles.ExistsFile(loc, 't.txt') = FALSE THEN ... END;
        ...


Т.е. при любой манипуляции с файлами выполняется Wai (Where am I?). Wai "осматривается по сторонам" и сообщает программе где он собссно находится. Не обращайте, кстати, внимания на bbLocator(HostFiles.Locator).path+path - другой path это строковая константа, указывающая куда сохранять дальше (т.е. если path = '\Abc\Def\', а BB лежит в 'C:\BlackBox', то файл проверится в 'C:\BlackBox\Abc\Def\')

Если еще чуть-чуть покуролесить можно будет даже отказаться от импорта MtFiles, НО бессмысленно будет это делать, если даже сейчас у меня не получилось реализовать то, о чем спрашивал...

Отдаюсь на ваш справедливый суд - в локатор loc возвращается полный путь или относительный? Я просто в этом не очень разбираюсь, вы, пожалуй, в этом убедились...)


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

Зарегистрирован: Вторник, 29 Август, 2006 12:32
Сообщения: 2662
Откуда: Россия, Ярославль
SanekSunshine писал(а):
loc := Files.dir.This(bbLocator(HostFiles.Locator).path+path);

Относительный путь от локатора вычисляется самим локатором:
Код:
loc:=Files.dir.This('');
loc:=loc.This('Abc/Def');

безо всяких Хостов!!! Признайтесь, вы доку читали?

SanekSunshine писал(а):
Код:
IF ~MtFiles.ExistsFile(loc, 't.txt') = FALSE THEN ... END;
ЖЕСТЬ! Позвольте, я переведу на русский:
Код:
ЕСЛИ НЕ(ФайлСуществует()) = ЛОЖЬ ТО ... ВСЁ;

Если вынести ЛОЖЬ за скобки, то получится
Код:
ЕСЛИ ФайлСуществует()=ИСТИНА ТО...ВСЕ;
При всём при этом, константы TRUE и FALSE никогда не используются в провеках истинности. Записываются только сами выражения, то есть правильно:
Код:
IF MtFiles.ExistsFile(loc, 't.txt') THEN ... END;


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

Зарегистрирован: Четверг, 02 Апрель, 2009 13:42
Сообщения: 23
Пётр Кушнир писал(а):
SanekSunshine писал(а):
loc := Files.dir.This(bbLocator(HostFiles.Locator).path+path);

Относительный путь от локатора вычисляется самим локатором:
Код:
loc:=Files.dir.This('');
loc:=loc.This('Abc/Def');

безо всяких Хостов!!! Признайтесь, вы доку читали?


Я же уже писал, что мне НЕ нужен относительный путь.

Пётр Кушнир писал(а):
SanekSunshine писал(а):
loc := Files.dir.This(bbLocator(HostFiles.Locator).path+path);


SanekSunshine писал(а):
Код:
IF ~MtFiles.ExistsFile(loc, 't.txt') = FALSE THEN ... END;
ЖЕСТЬ! Позвольте, я переведу на русский:
Код:
ЕСЛИ НЕ(ФайлСуществует()) = ЛОЖЬ ТО ... ВСЁ;

Если вынести ЛОЖЬ за скобки, то получится
Код:
ЕСЛИ ФайлСуществует()=ИСТИНА ТО...ВСЕ;
При всём при этом, константы TRUE и FALSE никогда не используются в провеках истинности. Записываются только сами выражения, то есть правильно:
Код:
IF MtFiles.ExistsFile(loc, 't.txt') THEN ... END;


Я просто сначала неправильно Вас понял. Пропустим этот недочет. Вот, допустим, я это сейчас подправлю - будет ЧТО? Получение полного или относительного локатора?


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

Зарегистрирован: Вторник, 29 Август, 2006 12:32
Сообщения: 2662
Откуда: Россия, Ярославль
SanekSunshine писал(а):
Я же уже писал, что мне НЕ нужен относительный путь.
Давайте по-порядку:
это локатор корневого каталога ББ
Код:
bbLocator:=Files.dir.This('')

это локатор каталога внутри каталога ББ. То есть, этот локатор - относительный относительно bbLocator.
Код:
loc := Files.dir.This(bbLocator(HostFiles.Locator).path+path)

Я написал:
[quote="Пётр Кушнир писал(а):
Относительный путь от локатора вычисляется самим локатором:
Код:
loc:=Files.dir.This('');loc:=loc.This('Abc/Def');


То есть, в моём примере - loc в конце концов будет равен вашему, потому что второй локатор вычисляется относительно первого. Но даже это ещё не всё.
В реальности:
Код:
loc:=Files.dir.This('Abc/Def');

уже является локатором, указывающим на каталог внутри каталога ББ, (где бы каталог ББ не находился), а виндовый путь уже будет полный:
Код:
loc(HostFiles.Locator).path = 'с:\bb\Abc\Def'

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


Последний раз редактировалось Пётр Кушнир Суббота, 04 Апрель, 2009 20:35, всего редактировалось 1 раз.

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

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


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

Зарегистрирован: Четверг, 02 Апрель, 2009 13:42
Сообщения: 23
Синтаксис здесь столь большого значения не имеет - я с тем же успехом мог поправить сообщение, ничего бы не изменилось. Но спасибо, учту)

Ну в целом, я вас понял но, как я уже ранее написал, указание относительного пути к ББ создает ошибку при сохранении свойств. Когда я писал в константе path ОТНОСИТЕЛЬНЫЙ путь происходил трап, а когда ПОЛНЫЙ (причем в обоих случаях создавал локатор ПОЛНОСТЬЮ под path)

Код:
В path было не

"Abc/Def", а

"С:BlackBox/Abc/Def"


ошибка исчезала и свойства сохранялись именно на ЭТОМ компьютере, рядом с загруз. пакетом а не на сервере рядом со средой. А вы говорите, что они равносильны.

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


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

Зарегистрирован: Вторник, 29 Август, 2006 12:32
Сообщения: 2662
Откуда: Россия, Ярославль
На "сервере" и не должно появляться изменений, в этом вроде как суть.
Код:
MODULE PrivateTestLoc;

   IMPORT Files, Dialog, Log, HostFiles;
   
   PROCEDURE Do*;
   VAR loc : Files.Locator; file : Files.File; res : INTEGER; VAR s : ARRAY 512 OF CHAR;
   BEGIN
      loc:=Files.dir.This('Private/Rsrc');
      file:=Files.dir.New(loc, Files.dontAsk);
      file.Register('test','txt', Files.dontAsk, res);
      file.Close;
      (* Log.String(HostFiles.startupDir); *)
   END Do;
   
BEGIN

END PrivateTestLoc.

PrivateTestLoc.Do



Работает для "серверной" системы. Создаёт файл в том каталоге, который /USE.

Ну и по сабжу, крайне нехорошее решение: если модифицировать HostFiles, сделав глобальную переменную startupDir-: FullName экспортированой, то можно узнать путь ядра запуска. При этом, правда, надо пересобрать exe-шник ББ. Вообщем крайне неприятно. Ну или через Kernel...


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

Зарегистрирован: Вторник, 27 Ноябрь, 2007 20:40
Сообщения: 48
SanekSunshine писал(а):
Допустим, мой BlackBox.exe лежит в какой-нибудь произвольной директории. Каким путем я могу в переменную строкового типа вернуть эту самую директорию? Может подсистема какая нибудь есть? Подскажите пожалуйста, заранее спасибо.


В XDS Oberon2 есть модуль ProgEnv, получить с его помощью путь можно так:
NEW(str, ProgEnv.ProgramNameLength()+1);
ProgEnv.ProgramName(str^);
STextIO.WriteString(str^);
InOut.WriteLn;

В ББ можно сделать что-то похожее используя WinApi. Например через функцию
GetCommandLine получить командную строку, а в ней первый параметр есть path.

Вот для иллюстрации тест (берёт всю командную строку и выводит её в лог):

Код:
[size=85]MODULE t_info2;
IMPORT  G := StdLog, SYS := SYSTEM, W := WinApi;
TYPE PSTR2 = POINTER TO ARRAY OF CHAR;

PROCEDURE CmdStrLen(): INTEGER;
   CONST maxL = W.MAX_PATH;
    VAR pw: W.PtrWSTR;  c: CHAR;
      adr, a,  j : INTEGER;
BEGIN
   pw := W.GetCommandLineW();
   adr := SYS.ADR(pw^);  a := SYS.ADR(c);
   j := 0;  c := 1X;
   WHILE (c # 0X) & (j < maxL) DO
      SYS.MOVE(adr + j*2, a, 2);
      INC(j);
   END;
   RETURN (j - 1);
END CmdStrLen;


PROCEDURE CmdStr(VAR s: PSTR2): INTEGER;
    VAR pw: W.PtrWSTR;  L : INTEGER;
BEGIN
   L := CmdStrLen();
   IF (s = NIL) OR (LEN(s^) <= L) THEN NEW(s, L+1); END;
   pw := W.GetCommandLineW();
   SYS.MOVE(SYS.ADR(pw^), SYS.ADR(s^), 2*(L+1));
   RETURN L;
END CmdStr;


PROCEDURE Do*;
   VAR s: PSTR2;  L: INTEGER;
BEGIN 
   G.Int(CmdStrLen()); G.Ln;
   L := CmdStr(s);
   G.String("L = "); G.Int(L); G.Ln;
   G.String("s = "); G.String(s^);  G.Ln;
END Do;

     
END t_info2.

t_info2.Do[/size]


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

Зарегистрирован: Четверг, 02 Апрель, 2009 13:42
Сообщения: 23
Вау, спасибо...Надо будет опробовать. :)


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

Зарегистрирован: Четверг, 02 Апрель, 2009 13:42
Сообщения: 23
Бугогактототам писал(а):
Ух ты! Сработало)


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

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


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

Зарегистрирован: Понедельник, 28 Ноябрь, 2005 10:28
Сообщения: 1437
Александр Ильин писал(а):
Если так уж сильно надо, добавьте объекту HostFiles.Locator метод GetPath, и пусть возвращает вам строку.

Только добавлять надо не метод, а процедуру.


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

Зарегистрирован: Пятница, 25 Ноябрь, 2005 12:02
Сообщения: 8500
Откуда: Троицк, Москва
Trurl писал(а):
добавлять надо не метод, а процедуру.
Спасибо за напоминание. А то инерция, понимаиш.


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

Зарегистрирован: Суббота, 26 Ноябрь, 2005 10:37
Сообщения: 875
Откуда: Россия, Владивосток
Пётр Кушнир писал(а):
И ещё, как только вы добавите такой метод, так тут же потеряете совместимость со всеми остальными оригинальными экземплярами ББ, поэтому такой вариант даже нельзя рассматривать. Разве что в качестве мысленного экспериимента :)

Смотря как добавлять. Я добавил в Files сообщения, и при этом все компоненты с зинновского сайта работают и не жужжат - ибо добавление в модуль новых сущностей не меняет "отпечатки" существующих. А через сообщения вполне себе добывается и имя локатора, для умеющих с ентими сообщениями работать.


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

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


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

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


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

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