В нескольких моих приложениях у меня есть код, похожий на следующий:
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;
В одном приложении, в первый раз, когда я пытаюсь выполнить это, я последовательно получаю исключение 103 ошибки ввода-вывода в строке с оператором Append (файл существует до вызова этого). Все последующие попытки операции будут работать нормально - пока я не перезапущу приложение.
Все документы, которые я нашел об этой ошибке, указали, что это вызвано вызовом CloseFile
без предшествующих Reset
или Rewrite
(Append
обычно не упоминается) или если файл находился в использование другим процессом. Поскольку исключение происходит до вызова CloseFile
, оно, очевидно, не может быть первым.
Я уже пробовал вставить Reset
сразу после AssignFile
для хорошей меры, но затем я получаю исключение в этой строке.
Также нет другого приложения, открыто доступного для этого файла. Я говорю "открыто", потому что у меня есть небольшое подозрение, что антивирус (TrendMicro в моем случае) может быть куклитом здесь (так что, возможно, используется файл ). Если это действительно проблема, что было бы лучше всего вокруг нее? Жесткое кодирование автоматической повторной попытки на самом деле не похоже на чистое решение для меня...
Другим случаем, когда я иногда получаю ошибку 103, является этот код, который я использую для создания пустого файла (или чаще всего для удаления существующего файла):
AssignFile(lFile, AFileName);
try
Rewrite(lFile);
finally
CloseFile(lFile);
end;
В этом случае это намного сложнее воспроизвести. Это происходит гораздо реже. В большинстве случаев это похоже на первый запуск после того, как я перекомпилировал приложение. Может ли это снова стать антивирусом? Я только когда-либо видел это на моей машине разработки и никогда не получал отчет от клиента. Как и в случае с первым сценарием, это всегда случается один раз на один сеанс приложения (если вообще). Последующие попытки всегда успешны.
Любые предложения по другому, потенциально более безопасному подходу к созданию пустых файлов или опорожнению существующих?