В некоторых из моих приложений у меня есть код, подобный следующему:
if ForceDirectories(ExtractFilePath(lLogName)) then
begin
AssignFile(lLog, lLogName);
try
if FileExists(lLogName) then
Append(lLog)
else
Rewrite(lLog);
Writeln(lLog, lLogLine);
finally
{$I-}CloseFile(lLog);{$I+}
end;
end;
В одном приложении, когда я впервые пытаюсь выполнить это, я последовательно получаю исключение I / O 103 в строке с оператором Append (файл существует до вызова этого). Однако все последующие попытки выполнения этой операции будут работать нормально, пока я не перезапущу приложение.
Все документы, которые я обнаружил об этой ошибке, указывают, что это может быть вызвано вызовом CloseFile
без предварительного Reset
или Rewrite
(Append
, как правило, не упоминается), или если файл находился в использовать другой процесс. Поскольку исключение возникает до вызова CloseFile
, оно, очевидно, не может быть первым.
Я уже пытался вставить Reset
сразу после AssignFile
, но затем получаю исключение в этой строке.
Нет другого приложения, которое открыто обращается к этому файлу. Я говорю «откровенно», потому что у меня есть небольшое подозрение, что антивирус (в моем случае TrendMicro) может быть ключевым моментом здесь (поэтому, возможно, файл используется ). Если бы это была действительно проблема, что было бы лучшим способом обойти это? Жесткое программирование автоматической повторной попытки на самом деле не кажется мне чистым решением ...
Еще один случай, когда я иногда получаю ошибку 103, - это код, который я использую для создания пустого файла (или чаще для очистки существующего файла):
AssignFile(lFile, AFileName);
try
Rewrite(lFile);
finally
CloseFile(lFile);
end;
В этом случае гораздо сложнее воспроизвести. Это случается намного реже. В большинстве случаев это происходит при первом запуске после перекомпиляции приложения. Может ли это снова стать антивирусом? Я только когда-либо видел, чтобы это случилось на моей машине разработки, и никогда не получал отчет от клиента. Как и в первом сценарии, это происходит только один раз за сеанс приложения (если вообще). Последующие попытки всегда успешны.
Есть предложения по другому, потенциально более безопасному подходу к созданию пустых файлов или очистке существующих?