function IsFileInUse(FileName: TFileName): Boolean;
var
HFileRes: HFILE;
begin
Result := False;
ifnot FileExists(FileName) then Exit;
HFileRes := CreateFile(PChar(FileName),
GENERIC_READ or GENERIC_WRITE,
0,
nil,
OPEN_EXISTING,
FILE_ATTRIBUTE_NORMAL,
0);
Result := (HFileRes = INVALID_HANDLE_VALUE);
ifnot Result then
CloseHandle(HFileRes);
end;
procedure TForm1.Button1Click(Sender: TObject);
beginif IsFileInUse('c:\Programs\delphi6\bin\delphi32.exe') then
ShowMessage('File is in use.');
else
ShowMessage('File not in use.');
end;
Перевод контента на русский язык:
Код Delphi defines функцию IsFileInUse, которая проверяет, является ли файл текущим в использовании другим процессом или приложением. Функция использует API Windows CreateFile для попытки открыть указанный файл. Если файл не может быть открыт потому что он уже используется, функция CreateFile возвращает недопустимое значение handle (INVALID_HANDLE_VALUE). Функция затем проверяет это условие и устанавливает свой результат в True, указывая, что файл используется.
Код также включает в себя процедуру Button1Click, которая вызывается при событии клика кнопки. Эта процедура вызывает функцию IsFileInUse с конкретным путем файла ('c:\Programs\delphi6\bin\delphi32.exe') и отображает сообщение об ошибке, указывая, является ли файл в использовании или нет.
Вот некоторые улучшения, которые можно сделать в этом коде:
Обработка ошибок: Код не обрабатывает ошибки должным образом. Если возникает ошибка при вызове CreateFile, она должна быть поймана и обработана вместо просто выхода из функции.
Обработка пути файла: Код предполагает конкретный путь файла, но в реальных приложениях обычно хочется позволить пользователю указать имя файла или просмотреть его. Вы можете использовать компонент OpenDialog для достижения этого.
Организация кода: Функция IsFileInUse отвечает за обе проверки использования файла и закрытие handle, если это необходимо. Лучше было бы разделить эти ответственности между двумя разными функциями, одной из которых будет проверять доступность файла, а другой - закрывать handle.
Вот обновленная версия кода с улучшенной обработкой ошибок и организацией кода:
functionIsFileInUse(FileName:TFileName):Boolean;varHFileRes:HFILE;beginResult:=False;ifnotFileExists(FileName)thenExit;tryHFileRes:=CreateFile(PChar(FileName),GENERIC_READorGENERIC_WRITE,0,nil,OPEN_EXISTING,FILE_ATTRIBUTE_NORMAL,0);Result:=(HFileRes=INVALID_HANDLE_VALUE);exceptonE:ExceptiondoResult:=True;end;end;procedureTForm1.Button1Click(Sender:TObject);varFilePath:string;beginifOpenDialog1.ExecutethenbeginFilePath:=OpenDialog1.FileName;ifIsFileInUse(FilePath)thenShowMessage('File is in use.')elseShowMessage('File not in use.');end;end;
Замечание: в этом коде используется блок try-except, чтобы поймать любые исключения, raised функцией CreateFile, и установить результат в True, если исключение возникает. Таким образом, код может обрабатывать ошибки более надежно, чем раньше. Кроме того, я добавил компонент OpenDialog для позволения пользователю просмотреть файл вместо использования конкретного пути. Процедура Button1Click теперь использует этот компонент для получения выбранного пути файла и отображения соответствующего сообщения.
Определение функции IsFileInUse, которая проверяет, находится ли указанный файл в использовании.
Комментарии и вопросы
Получайте свежие новости и обновления по Object Pascal, Delphi и Lazarus прямо в свой смартфон. Подпишитесь на наш Telegram-канал delphi_kansoftware и будьте в курсе последних тенденций в разработке под Linux, Windows, Android и iOS
Материалы статей собраны из открытых источников, владелец сайта не претендует на авторство. Там где авторство установить не удалось, материал подаётся без имени автора. В случае если Вы считаете, что Ваши права нарушены, пожалуйста, свяжитесь с владельцем сайта.