Delphi: Почему я иногда получаю ошибку ввода-вывода 103 с этим кодом? - PullRequest
10 голосов
/ 11 марта 2009

В некоторых из моих приложений у меня есть код, подобный следующему:

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;

В этом случае гораздо сложнее воспроизвести. Это случается намного реже. В большинстве случаев это происходит при первом запуске после перекомпиляции приложения. Может ли это снова стать антивирусом? Я только когда-либо видел, чтобы это случилось на моей машине разработки, и никогда не получал отчет от клиента. Как и в первом сценарии, это происходит только один раз за сеанс приложения (если вообще). Последующие попытки всегда успешны.

Есть предложения по другому, потенциально более безопасному подходу к созданию пустых файлов или очистке существующих?

Ответы [ 11 ]

0 голосов
/ 11 марта 2009

Ваш пример кода должен работать в целом, эти ошибки, похоже, ошибки доступа. Чтобы определить причину этого, вы можете попытаться отключить TrendMicro и проверить, сохраняется ли проблема.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...