adimetrius писал(а):
Напротив, в открытой модульной системе закрывать файл (открытый в shared режиме) можно только в исключительных случаях, например, когда вы точно знаете, что это вы же его создали, и пока вы им пользовались, никто другой (т.е. никакой другой модуль) гарантированно его не открыл. (Хотя достоверно это можно знать только про анонимные файлы). А в остальных случаях - на свой страх и риск.
Спасибо за разъяснение — это очень ценно.
Ну и надо бы как-то документировать это получше. А то там написано, что лучше вызывать Close, и это прям сбивает с толку.
Цитата:
If it is known that a file won't be used again, it is recommended to call its Close procedure.
И еще:
Цитата:
Close should (but need not necessarily) be called explicitly after a file is not needed anymore.
Я всегда закрывал файлы, чтобы кэш на диск сбросился и сборщик собрал лишнее. К проблемам это, к счастью пока не приводило. Однако могло. Буду умнее впредь
Обновлённый пример. Закрывать файл не обязательно. Ну и я считаю, что вполне правомерно проверять файлы на их существование открытием.
Код:
MODULE EasyLibrarian;
(**
project = "BlackBox 2.0"
organization = "www.oberon.ch, blackbox.oberon.org"
contributors = "Ivan Denisov"
version = "System/Rsrc/About"
copyright = "System/Rsrc/About"
license = "The 2-Clause BSD License"
changes = ""
issues = ""
**)
IMPORT Files, DevCPM, StdLibrarian;
TYPE
Librarian = POINTER TO RECORD (StdLibrarian.Librarian)
root: Files.Locator
END;
PROCEDURE (lib: Librarian) GetSpec (IN sub, name: ARRAY OF CHAR; what: INTEGER; OUT loc: Files.Locator; OUT fname: Files.Name; OUT ftype: Files.Type);
VAR f: Files.File; loc2: Files.Locator;
BEGIN
loc := lib.root.This(sub);
CASE what OF
| StdLibrarian.source:
loc := loc.This('Mod');
IF loc.res = 0 THEN
loc2 := loc;
f := Files.dir.Old(loc2, name + ".cp", Files.shared);
IF loc2.res = 0 THEN
ftype := "cp";
ELSE
ftype := "odc"
END;
ELSE
ftype := "odc"
END;
fname := name$
| StdLibrarian.symbols: loc := loc.This('Sym'); ftype := 'osf'; fname := name$
| StdLibrarian.code: loc := loc.This('Code'); ftype := 'ocf'; fname := name$
| StdLibrarian.docu: loc := loc.This('Docu'); ftype := 'odc'; fname := name$
| StdLibrarian.moddocu: loc := loc.This('Docu'); ftype := 'odc'; fname := name$
| StdLibrarian.rsrc: loc := loc.This('Rsrc'); ftype := 'odc'; ; fname := name$
(* not sure... how 'bout arbitrary resources? *)
ELSE HALT(20)
END;
lib.res := StdLibrarian.OK
END GetSpec;
PROCEDURE Set*;
VAR lib: Librarian;
BEGIN
NEW(lib);
lib.root := Files.dir.This("");
StdLibrarian.SetLib(lib);
DevCPM.lib := lib;
END Set;
END EasyLibrarian.