Собственно, в документации к модулю Files, кажется, все есть, чтобы выстроить ответы на ваш вопрос. Вот пример:

## Код:
```
MODULE MyM;
  IMPORT Files;
  
  PROCEDURE Read* (IN path, name: ARRAY OF CHAR);
    VAR rd: Files.Reader; f: Files.File; loc: Files.Locator;
  BEGIN
    loc := Files.dir.This(path);  (* преобразуем путь в локатор - внутреннее представление пути в ББ *)
    f := Files.dir.Old(loc, name$, Files.shared);  (* Old - открываем существующий файл *)
    rd := f.NewReader(NIL);   (* получаем у файла (файловой переменной) читатель - устройство для чтения файла *)
    rd.SetPos(0);   (* позиционируем, хотя после создания читателя он уже позиционирован на 0; это для примера *)
    REPEAT
      rd.ReadByte(b);   (* читаем 1 байт в переменную b; при этом позиция читателя сдвигается на 1 *)
      IF ~rd.eof THEN   (* проверка end of file *)
        Log.Char(CHR(b))    (* истолковываем прочитанный байт и выводим литеру в журнал *)
      END
    UNTIL rd.eof
  END Read;

END MyM.
```

Можно проверить, вставив в текст коммандер (!)"MyM.Read('/tmp', 'file')".

Пояснения: в КП (языке) нет понятия файл. В ББ есть модуль Files и в нем абстрактный тип File. Такие файлы - это всегда цепочки байт. У Читателя есть процедуры для чтения из файла именно байт, одного или множества. А как дальше истолковывать эти байты - как двоичные или текстовые данные, в какой кодировке и т.п. - это уже дело ваше. В моем примере я истолковал каждый байт как код литеры: привел код к литере CHR(b) и вывел в журнал.

В примере указан абсолютный путь '/tmp'. Относительные пути отсчитываются от папки BlackBox.