Код:
PROCEDURE Export* (loc: Files.Locator; name: Files.Name; conv: Converter; s: Stores.Store);
VAR res: INTEGER; file: Files.File; val: ExpVal; ok: BOOLEAN;
BEGIN
ASSERT(s # NIL, 20); ASSERT(~(s IS Stores.Alien), 21);
ASSERT(loc # NIL, 22); ASSERT(name # "", 23);
file := Files.dir.New(loc, Files.ask); (* fileLoc := loc; *)
IF file # NIL THEN
IF conv = NIL THEN
conv := doc
ELSE ASSERT(conv.exp # "", 24)
END;
GetCommand(conv.exp, val, ok);
IF ok THEN
val.p(s, file);
IF loc.res # canceled THEN
file.Register(name, conv.fileType, Files.ask, res); loc.res := res
END
ELSE Dialog.ShowMsg("#System:ConverterFailed"); loc.res := canceled
END
END
END Export;
См. строку: IF loc.res # canceled THEN
loc.res выставляется выше, после Files.dir.New.
А здесь вызов конвертера для записи в файл вызывается до этого IF (правда, он выше под охраной file # NIL).
Это может, правда, иметь смысл, только если New в случае loc.res = canceled (пользователь не подтвердил создание нового каталога) таки возвращает файл. Тогда мы в него выполнили экспорт, но реально Register не делаем.
Но в текущей реализации HostFiles - нет, там при canceled New возвращает NIL.