Как сохранить файл в какой-то момент, не закрывая его?
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, вы можете сделать это, используя
- статические члены класса,
- используя API в постоянной процедуре и публикуя ее,
- используя API в супер-процедуре сеанса и вызывая его API
STREAMS даст вам возможность отделить вывод для одной процедуры или класса в один файл и не допустить смешения этого вывода с производственным выходом, однако он ограничен текущей программой, что означает, что он не является общим решением в качестве приложения. Всесоюзный каротаж