Как сохранить файл в какой-то момент, не закрывая его?

OUTPUT TO "logfile.txt".

FOR EACH ...:
  ...
  PUT "Some log data". OUTPUT CLOSE. OUTPUT TO "logfile.txt" APPEND.
  ...
END.

Не найдено подходящего оператора для сохранения файла в какой-то момент. Я не хочу использовать UNBUFFERED APPEND потому что это предположительно медленнее. Может быть, есть встроенные средства ведения журналов? Может быть, потоки могли бы помочь мне? Проблема в моем решении, что я должен указать имя файла журнала каждый раз, когда я открываю его с OUTPUT TO заявление. Вложенная процедура может не иметь понятия о имени файла.

2 ответа

Решение

Здесь нет опции "сохранить".

Однако... вы можете принудительно сбросить вывод:

put control null(0).

"Предположительно медленнее" ужасно расплывчато. Да, потенциально больше ввода-вывода с небуферизованным выводом. Но действительно ли это имеет значение, во многом зависит от того, что вы делаете, и как это будет использоваться. Маловероятно, что это действительно имеет значение.

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

Да, есть встроенные средства ведения журналов. Посмотрите на ручку системы LOG-MANAGER.

Код в вопросе будет лучше написано как:

define stream logStream.

output stream logStream to value( "log.txt" ) append unbuffered.

for each customer no-lock:
  put stream logStream custName skip.
  /* put stream logStream control null(0). */  /* if you want to try fooling with buffered output... */
end.

output stream logStream close.

Вопрос в его нынешнем виде по-прежнему неоднозначен.

Если вам нужен способ маршрутизации вывода через стандартный "сервис", аналогичный тому, что делает LOG-MANAGER, вы можете сделать это, используя

  1. статические члены класса,
  2. используя API в постоянной процедуре и публикуя ее,
  3. используя API в супер-процедуре сеанса и вызывая его API

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

Другие вопросы по тегам