Нет необходимости звонить по телефону GetLastError
. Вы смешиваете две разные модели обработки ошибок.
Звоните GetLastError
сразу же после вызова API, если в документации говорится об этом. Когда вы его назовете, что-то другое может быть очень хорошо вызвано SetLastError
и сбросить значение.
Неправильно позвонить GetLastError
, так как вы не используете функции Win32 и должны удалить звонок до GetLastError
. Ваш код должен быть:
procedure TForm1.Button1Click(Sender: TObject);
var
Stream: TStream;
begin
Stream := TFileStream.Create('d:\toto.docx', fmOpenRead);
try
// ....
finally
Stream.Free;
end;
end;
Если есть ошибка, исключение будет поднято, который будет сообщен обработчиком исключений верхнего уровня.
Временные пакеты не должны влиять на выполнение этого кода.
Возможные причины ошибки в том, что файл не существует или он заблокирован.
Вы писали:
if Assigned(Stream) then
Stream.Free;
Это всегда бессмысленно, так как метод Free
также проверяет ссылка на объект является nil
. На самом деле ваш код эквивалентен:
if Assigned(Stream) then
if Assigned(Stream) then
Stream.Destroy;
Так чище полагаться на тест внутри Free
и просто написать:
Stream.Free;
В комментариях вы заявляете, что вы на самом деле хотите проверить независимо от того, заблокирован ли файл. Не используйте для этого поток файлов. Вместо этого выполните следующие действия:
- Звоните
CreateFile
, чтобы открыть файл.
- Проверьте обнаруженную ручку на
INVALID_HANDLE_VALUE
.
- В случае ошибки используйте
GetLastError
, чтобы узнать причину ошибки.
- В противном случае закройте ручку с помощью
CloseHandle
.
Однако это не рекомендуется. Вы можете использовать этот подход, чтобы определить, что файл не заблокирован, но к тому моменту, когда вы попытаетесь его прочитать, он заблокирован. Существует неотъемлемое состояние гонки.
В качестве общего руководства лучше просить прощения, чем разрешения.
Хорошо, но я пишу этот код для обнаружения заблокированного документа. У getLastError без runtimepackge был код 32. Каков наилучший способ обнаружить, что файл заблокирован? – Joc02
См. Мои последние изменения –